Sissejuhatus
See õpik on kirjutatud inimestele, kes kasutavad, mitte ei uuri, statistikat. Õpiku kasutaja peaks olema võimeline töötama R keskkonnas (vt meie eestikeelset R-i konspekti). Meie lähenemised statistika õpetamisele on arvutuslikud, mis tähendab, et me eelistame meetodi matemaatilise aluse asemel õpetada selle kasutamist ja tulemuste tõlgendamist. See õpik on bayesiaanlik ja ei õpeta sageduslikku statistikat. Me usume, et nii on lihtsam ja tulusam statistikat õppida ja et Bayesi statistikat kasutades saab rahuldada 99% teie tegelikest statistilistest vajadustest paremini, kui see on võimalik klassikaliste sageduslike meetoditega. Me usume ka, et kuigi praegused kiired arengud bayesi statistikas on tänaseks juba viinud selle suurel määral tavakasutajale kättesaadavasse vormi, toovad lähiaastad selles vallas veel suuri muutusi. Nende muutustega koos peab arenema ka bayesi õpetamine.
Me kasutame järgmisi R-i pakette, mis on kõik loodud bayesi mudelite rakendamise lihtsustamiseks: rethinking, brms, rstanarm, BayesianFirstAid ja bayesplot. Lisaks veel bayesboot bootstrapimiseks. Bayesi arvutusteks kasutavad need paketid Stan ja JAGS mcmc sämplereid (viimast küll ainult BayesianFirstAid paket). Selle õpiku valmimisel on kasutatud McElreathi, Kruschke ja Gelmani õpikuid (VIITED).
Kuna osadele lugejatele on ilmselt õpetatud sageduslikku statistikat, võrdleme järgnevalt lühidalt sageduslikku ja bayesi statistilisi paradigmasid, et oleks paremini arusaadav, millest selle õpiku lugeja ilma jääb. Inimesed, kes ei ole õppinud sageduslikku statistikat võivad rahumeeli selle osa vahele jätta ning otsemaid siirduda osa 1. juurde.
Ajaloost ja tõenäosusest
Bayesiaanlik ja sageduslik statistika sünnitati üksteise järel sama ema poolt. Tema nimi on Laplace ja ta arendas välja kõigepealt bayesi statistika alused ning seejärel sagedusliku statistika omad. Sagedusliku statistika tekkimise ja hilisema õitsengu peamine põhjus oli arvutuslik lihtsus. Lihtsalt bayesi meetoditega ei olnud arvutustehnilistel põhjustel võimalik korralikult teadust teha enne 1990-ndaid aastaid, mil personaalarvutite kiire levik algatas suure buumi nende meetodite arendamises. Praegu on maailmas bayesi ja sageduslikku statistikat umbes pooleks (vähemalt uute meetodite arendustöö poole pealt), Eestis aga bayesi statistika 2017 aasta seisuga peaaegu, et puudub.
Statistika on ainulaadne teadus selle poolest, et see on alates oma lätetest 18. sajandil lahknenud kahes suunas, mis lahendavad samu teaduslikke küsimusi aga sellest hoolimata suures osas üksteisega ei haaku. Need kaks suunda on Bayesi statistika ja sageduslik statistika. Meie oleme bayesiaanid selles mõttes, et võimaluse korral eelistame me oma töös bayesi statistikat, ja ainult siis, kui seda on liiga keeruline rakendada (või kui meile ei meeldi inimene, kellele me statistikat teeme), kasutame sageduslikke meetodeid. Õnneks tuleb seda üha harvemini ette.
Statistikast leiab mõned meetodite klassid, mida võib edukalt vaadata nii
sagedusliku kui bayesiaanliku mätta otsast: eriti bootstrappimine ja osad
False Discovery Rate-i arvutamise meetodid.
Aga need on pigem erandid, mis kinnitavad reeglit.
Kahe statistika põhiline erinevus ei tule mitte matemaatikast — mõlemad harud lähtuvad samadest tõenäosusteooria aksioomidest ja nende vahel puuduvad matemaatilised lahkarvamused — vaid tõenäosuse tõlgendusest.
Bayesi tõlgenduses on tõenäosus on kas üksikteadlase või (vähemate arvates) teadusüldsuse usu määr mingi hüpoteesi kehtimisse. Hüpotees võib näiteks olla, et järgmise juulikuu sademete hulk Vilsandil jääb vahemikku 22 kuni 34 mm. Kui Bayesi arvutus annab selle hüpoteesi tõenäosuseks 0.57, siis oleme me selle teadmise najal nõus maksma mitte rohkem kui 57 senti kihlveo eest, mille alusel makstakse juhul, kui see hüpotees tõeseks osutub, välja 1 EUR (ja me saame vähemalt 43 senti kasumit).
Sageduslikud statistikud usuvad, et selline tõenäosuse tõlgendus on ebateaduslik, kuna see on “subjektiivne”. On võimalik, et n teadlast arvutavad korrektselt samade andmete põhjal n erinevat tõenäosust ja usuvad seega samade tõendite põhjal erinevaid asju. See võib juhtuda siis, kui nad alguses lähtuvad väga erinevatest taustauskumustest oma hüpoteeside kehtimise kohta. Kui te usute, et teie taustateadmised ei tohi mingil juhul mõjutada järeldusi, mis te oma andmete põhjal teete, siis te ei ole bayesiaan. Sel juhul pakub alternatiivi sageduslik tõenäosuse tõlgendus. Sageduslik tõenäosus on defineeritud kui teatud tüüpi andmete esinemise pikaajaline suhteline sagedus. Näiteks, kui me viskame münti palju kordi, siis peaks kullide (või kirjade) suhteline sagedus meile andma selle mündi tõenäosuse langeda kiri üleval. Selline tõenäosus on omistatav ainult sündmustele, mille esinemisel on sagedus. Teaduslik teooria ei ole selline sündmus. Seega ei ole sageduslikus statistikas võimalik rääkida ka hüpoteesi kehtimise tõenäosusest. Sageduslik lahendus on, selle asemel, et rääkida meie hüpoteesi tõenäosusest meie andmete korral, rääkida andmete, mis sarnanevad meie andmetega, esinemise tõenäosusest teatud hüpoteesi (mis aga ei ole meie hüpotees) kehtimise korral. Seega omistatakse sagedus (= tõenäosus) andmetele, mitte hüpoteesidele. Järgnevalt toome näite, kuidas bayesiaan ja sageduslik statistik lahendavad sama ülesande.
Näide: kahe grupi võrdlus
meil on 2 gruppi, katse ja kontroll, millest kummagis n mõõtmist ja me soovime teada, kas katsetingimus mõjutab mõõtmistulemust piisavalt, et olla teaduslikult huvitav. Me eeldame, et andmed on normaaljaotusega ja et n ei ole väga väike.
Bayesiaan
Statistiline küsimus on Bayesiaanil ja sageduslikul statistikul sama: kas ja kui palju erinevad kahe grupi keskväärtused? Bayesiaan alustab sellest, et ehitab kaks mudelit: andmete mudel ja taustateadmiste mudel. Kui andmed on normaaljaotusega siis on ka andmemudel normaaljaotus. Täpsemalt, andmemudel modeleerib, mida meie andmete põhjal saab öelda selle populatsiooni, kust andmed korjati, keskväärtuse kohta. See mudel on normaaljaotus, mille keskväärtus võrdub valimiandmete keskväärtusega ja standardhälve võrdub valimi standardhälvega, mis on jagatud ruutjuurega n-st (SEM = sd(valim)/sqrt(n)).
Taustateadmiste mudel on sageli samuti normaaljaotus. Kui meil on palju taustateadmisi, siis on see jaotus kõrge ja kitsas, kui meil on vähe taustateadmisi, siis on see madal ja lai. Igal juhul järgmise sammuna korrutab bayesiaan need kaks jaotust saades tulemuseks kolmanda normaaljaotuse, mille ta seejärel normaliseerib nii, et jaotuse alune pindala = 1.
See kolmas jaotus on posterioorne tõenäosus, mis sisaldab kogu infot, millest arvutada kõige tõenäolisem katseefekti suurus koos ebakindluse määraga selle ümber (mida rohkem andmeid, seda väiksem ebakindlus) ja tõenäosused, et tegelik katseefekt jääb ükskõik milllisesse meid huvitavasse vahemikku.
Sageduslik statistik
Sageduslik lähenemine seevastu sisaldab ainult ühte mudelit, mida võrreldakse valimi andmetega. Sageduslik statistik alustab täpselt sama moodi nagu bayesiaan, tekitades eelmisega identse anmdemudeli, mis on keskendatud valimi keskväärtusele ja omab sama laiust (SEM). Seejärel nihutab ta oma andmemudelit niipalju, et normaaljaotuse tipp ei ole enam valimi keskväärtuse kohal vaid hoopis 0-väärtuse kohal (näiteks 0-effekti kohal). Samas, jaotuse laius ei muutu. Seda nullile tsentreeritud mudelit kutsutakse null-hüpoteesiks (H0). Järgmine samm erineb samuti bayesiaani omast. Nüüd võrreldakse oma valimi keskväärtust H0 jaotusega. Kui valimi keskväärtuse kohal on H0 jaotus kõrge, siis on andmete tõenäosus H0 kehtimise korral suur. Ja kui valimi keskväärtuse kohal on H0 normaaljaotus madal, siis on andmete esinemise tõenäosus H0 all madal. Seda tõenäosust kutsutakse p väärtuseks. Mida väiksem on p väärtus, seda vähem tõenäolised on teie andmed juhul, kui H0 on tõene ja katseefekt võrdub nulliga. Tehniliselt on p defineeritud kui “teie andmete või 0-st veel kaugemal asuvate andmete esinemise pikaajaline suhteline sagedus tingimusel, et H0 kehtib”.
tulemuste tõlgendamine
Kui sageduslik statistik kirjutab oma artiklites, et tema “efekti suurus on statistiliselt oluline 0.05 olulisusnivool” siis ta ütleb sellega, et tema poolt arvutatud p < 0.05. Selle korrektne tõlgendus on, et juhul kui statistik pika aja jooksul võtab omaks “statistiliselt olulistena” kõik tulemused, millega kaasnev p < 0.05 ja lükkab tagasi kõik tulemused, mille p > 0.05, siis sooritab ta 5% sagedusega tüüp 1 vigu. See tähendab, et igast sajast tõesest H0-st, mida ta testib, võtab ta keskeltläbi 5 vastu kui statistiliselt olulised. Sellisel kujul töötab sageduslik statistika väga hästi — see on parim viis tüüp 1 vigade sageduse pikaajaliseks fikseerimiseks. Aga kuna me ei tea ühegi üksiku testi kohta ette, kas see testib kehtivat või mittekehtivat H0-i, siis on selle kasutegur katseseeriate ühekaupa tõlgendamisel vaieldav. Tuletame meelde, et sageduslikus statistikas ei saa rääkida H0 kehtimise tõenäosusest vaid peab rääkima andmete tõenäosusest (= andmete esinemise sagedusest) tingimusel, et H0 kehtib.
Kas p väärtusi saab tõlgendada ühekaupa kui hinnangut tõendusmaterjali hulgale, mida teie valim pakub H0 vastu? Selle üle on vaieldud üle 80 aasta, kuid tundub, et ainus viis seda kas või umbkaudu teha on bayesiaanlik. Kui te mõtlete p väärtuse definitsioonile, siis peaksite mõistma, miks p väärtust, mis on defineeritud pikaajalise sagedusena, on raske rakendada üksiksündmustele. Bayesiaanliku p väärtuste tõlgendamiskalkulaatori leiate aadressilt …
tüüpiline tulemuse kirjeldus artiklis:
sageduslik: the effect size is q (p < 0.01).
bayesiaanlik: the most likely effect size is q1 (90% CI= q2, q3) and the probability that the true effect is less than zero is q4 percent. [90% CI - credible interval; tähendab, et me oleme 90% kindlad, et tegelik efekti suurus asub vahemikus q2 … q3]
kahe paradigma erinevused
sageduslikus statistikas võrdub parim hinnang tegelikule efekti suurusele valimi keskmise efekti suurusega. Bayesi statistikas see sageli nii ei ole sest taustateadmiste mudel mõjutab seda hinnangut. Paljud mudelid püüavad ekstreemseid valimeid taustateadmiste abil mõistlikus suunas veidi nihutada, niiviisi vähendades ülepaisutatud efektide avaldamise ohtu.
sageduslik statistika töötab tänu sellele, et uurija võtab vastu pluss-miinus otsuseid: iga H0 kas lükatakse ümber või jäetakse kehtima. Seevastu bayesiaan mõtleb halli varjundites: sissetulevad andmed kas suurendavad või vähendavad hüpoteeside tõenäosusi (mis jäävad aga alati > 0 ja < 1).
p väärtused kontrollivad tüüp 1 vigade sagedust ainult siis, kui katse disaini ja hilisema tulemuste analüüsi detailid on enne katse sooritamist jäigalt fikseeritud (või eelnevalt on täpselt paika pandud lubatud variatsioonid katse- ja analüüsi protokollis). Eelkõige tähendab see, et valimi suurus ja kasutatav(ad) statistiline(sed) test(id) peavad olema eelnevalt fikseeritud. Me saame p väärtuse arvutada vaid üks kord ja kui p = 0.051, siis oleme sunnitud H0 paika jätma ning efekti deklareerimisest loobuma. Me ei saa lihtsalt katset juurde teha, et vaadata, mis juhtub. Bayesiaan seevastu võib oma posterioorse tõenäosuse arvutada kasvõi pärast iga katsepunkti kogumist ning katse peatada kohe (või alles siis), kui ta leiab, et tema posterioorne jaotus on piisavalt kitsas, et teaduslikku huvi pakkuda.
sagedusliku statistika pluss-miinus iseloom tingib selle, et kui tegelik efekti suurus on küll teaduslikult huvitav, aga siiski liiga väike, et teie katsesisese varieeruvuse ja valimi suuruse juures anda p < 0.05, siis annavad statistiliselt olulisi tulemusi ainult populatsiooniga võrreldes ülepaisutatud efekti suurusega ja alandatud varieeruvusega valimid. (Selliseid valimeid tekib tänu juhuslikele valimiefektidele.) Nii saab süstemaatiliselt kallutatud teaduse, mis hindab kordades üle oma efektide suurusi. Bayesi statistikas seda probleemi ei esine, kuna otsused ei ole pluss-miinus tüüpi.
bayesi statistika ei hoia tüüp 1 vigade sagedust kontrolli all. See-eest võtleb see nn valehäirete vastu, milleks kaasajal kasutatakse enim hierarhilisi shrinkage mudeleid. Neid käsitleme oma õpikus päris lõpus. See on ka bayesi vaste sageduslikus statistikas kasutatavatele multiple testingu suhtes adjusteeritud p väärtustele.
See on kõik, mida me sagedusliku statistika kohta ütleme. Mitte miski, mis järgneb, ei eelda sagedusliku paradigma tundmist ega valdamist.
1. osa: Mudel ja maailm
Andmeanalüüs ja statistika (siin sünonüümid) on lahutamatu osa igast loodusteadusest. Järgnevalt seletan, miks.
Suur ja väike maailm
Kuna maailm on liiga suur ja keeruline, et seda otse uurida, lõikavad teadlased selle väiksemateks tükkideks, kasutades tordilabidana teaduslike hüpoteese. Tüüpiline hüpotees pakub välja mittematemaatilise seletuse mõnele kitsalt piiritletud loodusnähtusele. Näiteks darvinistlik evolutsiooniteooria püüab seletada evolutsiooni toimemehhanisme. Seda teooriat võib võrrelda empiiriliste andmetega.
Mis juhtub, kui teie lemmikhüpotees on andmetega kooskõlas? Kas see tähendab, et see hüpotees on tõene? Või, et see on tõenäoliselt tõene? Kahjuks on vastus mõlemale küsimusele eitav. Põhjuseks on asjaolu, et enamasti leiab iga nähtuse seletamiseks rohkem kui ühe alternatiivse teadusliku hüpoteesi (näit. lamarksistlik evolutsiooniteooria) ning rohkem kui üks üksteist välistav hüpotees võib olla olemasolevate andmetega võrdses kooskõlas. Asja teeb veel hullemaks, et teoreetiliselt on võimalik sõnastada lõpmatult palju erinevaid teooriaid, mis kõik pakuvad alternatiivseid ja üksteist välistavaid seletusi samale nähtusele.
Olgu peale, kui me vaatame maailma kõiketeadja jumala perspektiivist, siis tema võib vaadelda kõikehõlmava tõendusmaterjali sobivust kõigi võimalike teooriatega ning valida välja selle ainsa teooria, mis kõige paremini tõendusmaterjaliga sobib. Kuigi, see eeldaks, et jumalal on lõpmata palju andmeid, sest muidu ei oleks tal loogiliselt võimalik lõpmata paljude teooriate vahel valida - aga jumala jaoks on kõik võimalik. Igal juhul meie, surelike, jaoks tähendab see, et teaduslikus “faktis” saab alati kahelda sest kunagi ei või kindel olla, et parimad teooriad lõpmata suurest teooriapilvest ei ole meil täiesti tähelepanuta jäänud ning, et meie jaoks eksisteerivad andmed kajastaksid hästi kõiki võimalikke andmeid! On selge nagu seebivesi, et mida vähem aega me kulutame teoorialoomeks ja andmete kogumiseks, seda vähem usutavad on ka meie teaduslikud järeldused. Enamasti on nii, et mida kehvem on olukord andmerindel, seda rohkem vajame statistikat. Kui meil õnnestuks oma andmetest ilma statistikata saia teha, ei kõhkleks me hetkegi! Eriti, kuna statistikaga käivad käsikäes statistilised mudelid.
Mudeli väike maailm
Ülalmainitud teadusliku meetodi puudused tingivad, et meie huvides on oma teaduslikke probleeme veel ühe taseme võrra lihtsustada, taandades need statistilisteks probleemideks. Selleks tuletame me tavakeelsest ja laiahaardelisest teaduslikust teooriast täpselt formuleeritud matemaatilise mudeli ning seejärel asume uurima oma mudelit.
Mudeli maailm erineb päris maailmast selle poolest, et mudeli maailmas on kõikvõimalikud sündmused, mis põhimõtteliselt võivad juhtuda, juba ette teada ja üles loetud (seda sündmuste kogu kutsutakse parameetriruumiks). Seega, tehniliselt on mudeli maailmas üllatused võimatud.
Mudeli eeliseks teooria ees on, et hästi konstrueeritud mudel on lihtsamini mõistetav — erinevalt vähegi keerulisemast teaduslikust hüpoteesist on mudeli eeldused ja ennustused läbinähtavad ja täpselt formuleeritavad. Mudeli puuduseks on aga, et erinevalt teooriast ei ole mingit võimalust, et mudel vastaks tegelikkusele ehk oleks tõene. Seda sellepärast, et mudel on taotluslikult lihtsustav (erandiks on puhtalt ennustuslikud mudelid, mis on aga enamasti läbinähtamatu struktuuriga). Mudel on kas kasulik või kasutu; teooria on kas tõene või väär. Mudeli ja maailma vahel võib olla kaudne “peegeldus”, aga mitte kunagi otsene side. Seega, ükski number, mis arvutatakse mudeli raames, ei kandu sama numbrina üle teaduslikku ega päris maailma. Ja kogu statistika (ka mitteparameetriline) toimub mudeli väikses maailmas. Arvud, mida statistika teile pakub, elavad mudeli maailmas; samas kui teie teaduslik huvi on suunatud päris maailmale. Näiteks 95% usaldusintervall ei tähenda, et te peaksite olema 95% kindel, et tõde asub selles intervallis – sageli ei tohiks te seda nii julgelt tõlgendada isegi kitsas mudeli maailmas.
Näide: Aristoteles, Ptolemaios ja Kopernikus
Aristoteles lõi teooria maailma toimimise kohta, mis domineeris haritud Eurooplase maailmapilti enam kui 1200 aasta vältel. Selle kohaselt asub universumi keskpunktis maakera ning kõik, mida siin leida võib, on tehtud neljast elemendist: maa, vesi, õhk ja tuli. Samas, kogu maailmaruum alates kuu sfäärist on tehtud viiendast elemendist (eeter), mida aga ei leidu maal (nagu nelja elementi ei leidu kuu peal ja sealt edasi). Taevakehad (kuu, päike, planeedid ja kinnistähed) tiirlevad ümber maa kontsentrilistes sfäärides, mis on omavahel seotud (mille vahel pole vaba ruumi). Seega on kogu liikumine eetri sfäärides ühtlane ja ringikujuline ja see liikumine põhjustab pika põhjus-tagajärg ahela kaudu kõiki liikumisi, mida maapeal kohtame. Kaasa arvatud meie sündimine, elukäik ja surm (mis on kõik liikumised). Kõik, mis maapeal huvitavat, ehk kogu liikumine, on algselt põhjustatud esimese liikumise poolt, mille käivitab kõige välimises sfääris paiknev meie jaoks mõistetamatu intellektiga “olend”.
Aristotelese suur teooria ühendab kogu maailmapildi alates kaasaegses mõistes keemiast ja kosmoloogiast kuni bioloogia, maateaduse ja isegi geograafiani. Sellised ühendteooriad on nagu suured sekvoiad; nad on rasked langetada, aga kui mõni siiski kukub, kostab ragin kaugele. Samas, ühte Aristotelese kosmoloogia olulist puudust nähti kohe. Nimelt ei suuda Aristoteles seletada, miks osad planeedid teavavõlvil vahest suunda muudavad ja mõnda aega lausa vastupidises suunas liiguvad (retrogression). Kuna astronoomia põhiline kasutusala oli astroloogia, siis põõrati planeetide liikumisele suurt tähelepanu. Lahenduseks ei olnud aga mitte suure teooria ümbertegemine või ümberlükkamine, vaid nõudlus uue teaduse järele, mis “päästaks fenomenid”. Siin tuli appi Ptolemaios, kes lõi matemaatilise mudeli, kus planeedid mitte lihtsalt ei liigu ringtrajektoori mõõda vaid samal ajal teevad ka väiksemaid ringe ümber esimese suure ringjoone. Neid väiksemaid ringe kutsutakse epitsükliteks. See mudel suutis planeetide liikumist taevavõlvil piisavalt hästi ennustada, et astroloogide nõudlik seltskond sellega rahule jäi.
Ptolemaiosel ja tema järgijatel oli tegelikult mitu erinevat mudelit. Osad neist ei sialdanud epitsükleid ja maakera ei asunud tema mudelites universumi keskel, vaid oli sellest punktist eemale nihutatud — nii et päike ei teinud ringe ümber maakera vaid ümber tühja punkti. Oluline oli, et leidus epitsüklitega mudel ja ilma epitsükliteta mudel, mis olid matemaatiliselt ekvivalentsed ja andsid seega võrdseid ennustusi. Oli selge, et Aristotelese teooria ja fenomenide päästmise mudelid olid fundamentaalselt erinevad asjad. Samal ajal kui Aritoteles seletas maailma põhiolemust põhjuslike seoste jadana (mitte matemaatiliselt), kirjeldas/ennustas Ptolemaios sellesama maailma käitumist matemaatiliste (mitte põhjuslike) struktuuride abil.
Nii tekkis olukord, kus maailma mõistmiseks kasutati 1000 aasta vältel Aristotelese ühendteooriat aga selle kirjeldamiseks ja tuleviku ennustamiseks hoopis Ptolemailisi mudeleid, mida keegi päriselt tõeks ei pidanud ja mida hinnati selle järgi, kui hästi need “päästsid fenomene”.
See toob meid Koperniku juurde, kes teadusajaloolaste arvates vallandas 17. sajandi teadusliku revolutsiooni avaldades raamatu, kus ta asetab päikse universumi keskele ja paneb maa selle ümber ringtrajektooril tiirlema. Kas Kopernikus tõrjus sellega kõrvale Aristotelese, Ptolemaiose või mõlemad? Kaasaegne seisukoht on, et kuigi Kopernikus soovis teha kolmandat, arvasid tema rängalt matemaatilise teose avaldamisele järgnenud 40 aasta vältel pea kõik asjatundlikud astronoomid, et ta soovis välja pakkuda vaid lihtsama alternatiivi epitsüklitega mudelile, mis selleks ajaks oli muutunud väga keerukaks (aga ka samavõrra ennustustäpseks). Kuna Kopernikuse raamat läks trükki ajal, mil selle autor oli juba surivoodil, kirjutas sellele eessõna üks tema vaimulikust sõber, kes püüdis oodatavat kiriklikku pahameeletormi leevendada väitega, et päikese keskele viimine ei ole muud kui mudeldamise trikk, millest ei tasu järeldada, et maakera ka tegelikult ümber päikese tiirleb (piibel nimelt räägib sellest, kuidas jumal peatas mõneks ajaks taevavõlvil päikese, mitte maa). Ja kuna eessõna oli anonüümne, eeldasid lugejad muidugi, et selle kirjutas autor. Lisaks, kuigi Kopernikus tõstis päikese keskele, jäi ta ringikujuliste trajektooride juurde, mis tähendas, et selleks, et tema mudel fenomenide päästmisel hätta ei jääks ja astroloogidele kasutu ei oleks, oli ta sunnitud maad ja planeete liigutana ümber päikese mõõda epitsükleid. Kokkuvõttes oli Koperniku mudel sama keeruline kui Ptolemaiose standardmudel (neis oli võrdne arv epitsükleid) ja selle abil tehtud ennustused planeetide liikumise kohta olid väiksema täpsusega.
Koperniku mudel suutis samas ennustada mõningaid nähtusi (planeetide näiva
heleduse muutumine, mis jõuab maksimumi nende lähimas asukohas maale), mida
Ptolemaiose mudel ei ennustanud. See ei tähenda, et need fenomenid oleksid
olnud vastuolus Ptolemaiose mudeliga. Lihtsalt, nende Ptolemaiose mudelisse
sobitamiseks oli vaja osad mudeli parameetrid fikseerida nii-öelda suvalistele väärtustele.
Seega Koperniku mudel töötas nii, nagu see oli, samas kui Ptolemaiose mudel vajas ad hoc tuunimimst.
Kui vaadata Koperniku produkti teooriana, mitte mudelina, siis oli sel selgeid eeliseid Aristotelese ees. Juba ammu oli nähtud komeete üle taevavõlvi lendamas (mis Aristotelese järgi asusid kinnistähtede muutumatus sfääris) ja supernoova tekkimist ja kadu, ning enam ei olnud kaugel ka aeg mil Galileo joonistas oma teleskoobist kraatreid kuu pinnal, näidates, et kuu ei saanud koosneda täiuslikust viiendast elemendist ja et sellel toimusid ilmselt sarnased füüsikalised protsessid kui maal. On usutav, et kui Kopernikus oleks jõudnud oma raamatule ise essõna kirjutada, oleks tema teooria vastuvõtt olnud palju kiirem (ja valulisem). Seega, teooria ja mudeli eristus on tähtis!
Koperniku teooriast tuleneb loogilise paratamatusena, et tähtedel esineb
maapealt vaadates parallaks. See tähendab, et kui maakera koos astronoomiga
teeb poolringi ümber päikese, siis kinnistähe näiv asukoht taevavõlvil
muutub sest astronoom vaatleb teda teise nurga alt. Pange oma nimetissõrm
näost u 10 cm kaugusele, sulgege parem silm, seejärel avage see ning sulgege
vasak silm ja te näete oma sõrme parallaksi selle näiva asukoha muutusena.
Tähtede parallaksi püüti mõõta juba Aleksandrias 1000 aastat enne
Kopernikust, et leida kinnitust teooriale, mille kohaselt maakera tiirleb
ümber päikese. Mõõtmised ei näidanud aga parallaksi olemasolu (sest maa
trajektoori diameeter on palju lühem kui maa kaugus tähtedest). Parallaksi
olemasolu sai kinnitust alles 19. sajandi teisel poolel, siis kui juba ammu
iga koolijüts uskus, et maakera tiirleb ümber päikese!
Millest koosneb mudel?
Mudel on matemaatilise formalism, mis püüab kirjeldada füüsikalist protsessi.
Näiteks, sageli kirjeldame me produkti kuhjumist ensüümreaktsioonis eksponentsiaalse funktsioni (mudeli) abil. Kui meie andmed seda tüüpi funktiooniga sobivad, ütleb see meile midagi konkreetse ensüümi töömehhanismi kohta. Teisest küljest, need mudelid, mis on “generatiivsed”, suudavad lisaks simuleerida ka uusi andmeid. Sealhulgas ka selliseid, mida päris maailmas ei saa kunagi esineda sest seal puuduvad vastavad tingimused. Mudelisse saab aga sisse kirjutada igasuguseid tingimusi ehk parameetri väärtusi (näit substraadi konsentratsioone, mida me ei suuda “päriselt” saavutada).
Oletame, et me mõõtsime N inimese pikkuse cm-s ja kaalu kg-s ning meid huvitab, kuidas inimeste pikkus sõltub nende kaalust.
Lihtsaim mudel pikkuse sõltuvusest kaalust on pikkus = kaal (formaliseeritult: y = x) ja see mudel ennustab, et kui Johni kaal = 80 kg, siis John on 80 cm pikkune. Selle mudeli saame graafiliselt kujutada nii
x <- 50:200 #y = kaal
y <- x # x = pikkus
plot(y~x, type="l", xlab="weight in kg", ylab="heigth in cm", main="fixed linear model")

kõigepealt painutame sirget. See joon on ikka veel täielikult fikseeritud, aga ta pole enam sirge (ehki tehniliselt on meil ikka lineaarne seos x ja y vahel)
x <- 50:200
y <- x + x**2
plot(x, y, type="l")

Mudeli keeles tähistame me seda, mida me ennustame (antud juhul pikkus) Y-ga ja seda, mille väärtuse põhjal me ennustame (antud juhul kaal) X-ga. Seega sirge mudeli matemaatiline formalism on Y = X. See on äärmiselt jäik mudel: ta on sirge kujuline ja selle sirge asukoht parameetriruumis on rangelt fikseeritud. Sirge lõikab y telge alati 0-s (ehk mudeli keeles: selle sirge intercept ehk lõikepunkt Y teljel = 0) ja tema tõusunurk saab olla ainult 45 kraadi (mudeli keeles: mudeli slope ehk tõus = 1). Selle mudeli jäikus tuleneb sellest, et selles mudelis ei ole parameetreid, mida me saaksime vabalt muuta ehk tuunida.
Kuidas aga kirjeldada sirget, mis võib paikneda 2-mõõtmelises ruumis ükskõik millises asendis? Selleks lisame mudelisse kaks parameetrit, intercept (a) ja tõus (b). Kui a=0 ja b=0, saame me eelpool kirjeldatud mudeli y = x. Kui a = 102, siis sirge lõikab y telge väärtusel 102. Kui b = 0.8, siis x-i tõustes 1 ühiku võrra tõuseb y-i väärtus 0.8 ühiku võrra. Kui a = 100 ja b = 0, siis saame sirge, mis on paraleelne x-teljega ja lõikab y telge väärtusel 100 (mis juhtub, kui a = Inf?). Seega, Teades a ja b väärtusi ning omistades x-le suvalise meid huvitava väärtuse, saab ennustada y-i keskmist väärtust. Näiteks, olgu andmete vastu fititud mudel:
pikkus(cm) = 102 + 0.8 * kaal(kg) ehk
y = 102 + 0.8x.
Omistades nüüd kaalule väärtuse 80 kg, tuleb mudeli poolt ennustatud keskmine pikkus 102 + 0.8 * 80 = 166 cm. Iga kg lisakaalu ennustab mudeli kohaselt 0.8 cm võrra suuremat pikkust.
a <- 102
b <- 0.8
x <- 0:100
y <- a + b * x
plot(y~x, type="l", xlab="weight in kg", ylab="heigth in cm", main="a more flexible linear model", ylim=c(50, 200))

See mudel ennustab, et 0 kaalu juures on pikku 102 cm, mis on rumal, aga mudelite puhul tavaline, olukord. Me tuunime mudelit andmete peal, mis ei sisalda 0-kaalu (sest 0-kaaluga inimesi pole olemas). Meie valimiandmed ei peegelda täpselt inimpopulatsiooni. Sirge mudel ei peegelda täpselt pikkuse-kaalu suhteid vahemikus, kus meil on reaalseid kaaluandmeid; ja ta teeb seda veelgi vähem seal, kus meil mõõdetud kaalusid ei ole. Seega pole mõtet imestada, miks mudeli intercept meie üle irvitab.
4 mõistet
X ja Y on muutujad, a ja b on parameetrid. Muutujate väärtused fikseeritakse andmete poolt, parameetrid fititakse muutujate väärtuste põhjal. Fititud mudel ennustab igale X-i väärtusele vastava kõige tõenäolisema Y väärtuse (Y keskväärtuse sellel X-i väärtusel).
Y - mida me ennustame (dependent variable, predicted varable)
X - mille põhjal me ennustame (independent variable, predictor)
muutuja (variable) - iga asi, mida me valimis mõõdame (X ja Y on kaks muutujat). Muutuja väärtused on fikseeritud andmete poolt. Muutujal on sama palju fikseeritud väärtusi kui meil on selle muutuja kohta mõõtmisandmeid.
parameeter (parameter) - mudeli koefitsient, millele võib omistada suvalisi väärtusi. Parameetreid tuunides fitime me mudeli võimalikult hästi sobituma andmetega.
Mudeli fittimine
Mudelid sisaldavad (1) matemaatilisi struktuure, mis määravad mudeli tüübi ning (2) parameetreid, mida saab andmete põhjal tuunida, niiviisi täpsustades mudeli kuju.
Seda tuunimist nimetatakse mudeli fittimiseks. Mudelit fittides on eesmärk saavutada antud tüüpi mudeli maksimaalne sobivus andmetega. Näiteks võrrand y = a + bx määrab mudeli, kus y = x on on see struktuur, mis tagab, et mudeli tüüp on sirge, ning a ja b on parameetrid, mis määravad sirge asendi. Seevastu struktuur y = x + x^2 tagab, et mudeli y = a + b1x + b2x^2 tüüp on parabool, ning parameetrite a, b1 ja b2 väärtused määravad selle parabooli täpse kuju. Ja nii edasi
Hea mudel on
võimalikult lihtsa struktuuriga, mille põhjal on veel võimalik teha järeldusi protsessi kohta, mis genereeris mudeli valmistamiseks kasutatud andmeid;
sobitub piisavalt hästi andmetega (eriti uute andmetega, mida ei kasutatud selle mudeli fittimiseks), et olla relevantne andmeid genereeriva protsessi kirjeldus;
genereerib usutavaid simuleeritud andmeid (see näitab mudeli kvaliteeti).
Sageli fititkse samade andmetega mitu erinevat tüüpi mudelit ja püütakse otsustada, milline neist vastab kõige paremini eeltoodud tingimustele. Näiteks, kui sirge suudab kaalu järgi pikkust ennustada paremini kui parabool, siis on sirge mudel kooskõlas teadusliku hüpoteesiga, mis annaks mehhanismi protsessile, mille käigus kilode lisandumine viiks laias kaaluvahemikus inimeste pikkuse kasvule ilma, et pikkuse kasvu tempo langeks.
Üle- ja alafittimine
Osad mudelite tüübid on vähem paindlikud kui teised (parameetreid tuunides on neil vähem liikumisruumi). Kuigi sellised mudelid sobituvad halvemini andmetega, võivad need ikkagi paremini kui mõni paindlikum mudel välja tuua andmete peidetud olemuse. Mudeldamine eeldab, et me usume, et meie andmetes leidub nii müra (mida mudel võiks ignoreerida), kui signaal (mida mudel püüab tabada). Kuna mudeli jaoks näeb müra samamoodi välja kui signaal, on iga mudel kompromiss üle- ja alafittimise vahel. Me lihtsalt loodame, et meie mudel on piisavalt jäik, et mitte liiga palju müra modelleerida ja samas piisavalt paindlik, et piisaval määral signaali tabada.
Üks kõige jäigemaid mudeleid on sirge, mis tähendab, et sirge mudel on suure tõenäosusega alafittitud. Keera sirget kuipalju tahad, ikka ei sobitu ta enamiku andmekogudega. Ja need vähesed andmekogud, mis sirge mudeliga sobivad, on genereeritud teatud tüüpi lineaarsete protsesside poolt. Sirge on seega üks kõige paremini tõlgendatavaid mudeleid. Teises äärmuses on polünoomsed mudelid, mis on väga paindlikud, mida on väga raske tõlgendada ja mille puhul on suur mudeli ülefittimise oht. Ülefititud mudel järgib nii täpselt valimiandmeid, et sobitub hästi valimis leiduva juhusliku müraga ning seetõttu sobitub halvasti järgmise valimiga samast populatsioonist (sest igal valimil on oma juhuslik müra). Üldiselt, mida rohkem on mudelis tuunitavaid parameetreid, seda paindlikum mudel, seda kergem on seda valimiandmetega sobitada ja seda raskem on seda mudelit tõlgendada. Veelgi enam, alati on võimalik konstrueerida mudel, mis sobitub täiuslikult lõpliku arvu andmepunktidega (selle mudeli parameetrite arv = N). Selline mudel on täpselt sama informatiivne kui andmed, mille põhjal see fititi — ja täiesti kasutu.

Joonis: Kasvava paindlikusega polünoomsed mudelid. mod_e1 on sirge võrrand y = a + b1x (2 parameetrit: a ja b1), mod_e2 on lihtsaim võimalik polünoom: y= a + b1x + b2x^2 (3 parameetrit), …, mod_e5: y= a + b1x + b2x^2 + b3x^3 + b4x^4 + b5x^5 (6 parameetrit). mod_e5 vastab täpselt andmepunktidele (N = 6).
AIC(mod_e1, mod_e2, mod_e3, mod_e4, mod_e5)
AIC näitab, et parim mudel on mod_e4. Aga kas see on ka kõige kasulikum mudel? Mis siis, kui 3-s andmepunkt on andmesisestaja näpuviga?
AIC - Akaike Informatsiooni Kriteerium - vaatab mudeli sobivust andmetega
ja mudeli parameetrite arvu.
Väikseim AIC tähitab parimat fitti väikseima parameetrite arvu juures
(kompromissi) ja väikseima AIC-ga mudel on eelistatuim mudel. Aga seda ainult
võrreldud mudelite hulgas. AIC-i absoluutväärtus ei loe - see on suhteline näitaja.

Joonis: sedamööda kuidas parameetrite arv mudelis kasvab, kasvab ka R ruut. R ruut 0.8 tähendab, et x-i varieeruvus suudab seletada kuni 80% y-i varieeruvusest. Lisaparameetri lisamine ei saa põhimõtteliselt R ruutu vähendada. Aga selle kasvu kiirus on aeglustuv. Ühel hetkel ei õigusta mudeli fiti paranemine enam mudeli paindlikuse kasvu (mis mõlemad saavutatakse parameetreid lisades).
Ülefittimise vältimiseks kasutavad Bayesi mudelid informatiivseid prioreid,
mis välistavad ekstreemsed parameetriväärtused.
Vt http://elevanth.org/blog/2017/08/22/there-is-always-prior-information/
Veamudel
Eelpool kirjeldatud mudelid on deterministlikud — nad ei sisalda hinnangut andmete varieeruvusele ennustuse ümber. Neid kutsutakse ka protsessi mudeliteks sest nad modelleerivad protsessi täpselt. Ehk kui mudel ennustab, et 80 kg inimene on 166 cm pikkune, siis protsessi mudel ei ütle, kui suurt kaalust sõltumatut pikkuste varieeruvust võime oodata 80 kg-ste inimeste hulgas? Selle hinnangu andmiseks tuleb mudelile lisada veel üks komponent, veamudel ehk veakomponent, mis sageli tuuakse sisse normaaljaotuse kujul. Veakomponent modelleerib üksikute inimeste pikkuste varieeruvust (mitte keskmise pikkuse varieeruvust) igal mõeldaval ja mittemõeldaval kaalul. Tänu sellele ei ole mudeli ennustused enam deterministlikud, vaid tõenäosuslikud.
Kuidas veakomponent lineaarsesse mudelisse sisse tuua?
ilma veakomponendita mudel: y = a + bx
Veakomponent tähendab, et y-i väärtus varieerub ümber mudeli poolt ennustatud keskväärtuse ja seda varieeruvust normaaljaotusega modelleerides saame
y ~ dnorm(mu, sigma)
kus mu on mudeli poolt ennustatud keskväärtus ja sigma on mudeli poolt ennustatud standardhälve ehk varieeruvus andmepunktide tasemel. Tilde ~ tähistab seose tõenäosuslikkust.
Sirge mudelisse varieeruvuse sisse toomiseks defineerime mu ümber nõnda:
mu = a + bx, mis tähendab, et
y ~ dnorm(a + bx, sigma)
See ongi sirge mudel koos veakomponendiga. Peatükis 3 õpime me selliste mudelitega töötama.
Kõik statistilised mudelid on tõenäosusmudelid ning sisaldavad veakomponenti.
Statistiline mudel koosneb 3 komponendist:
> (1) matemaatiline struktuur, mis sisaldab muutujaid ja annab mudeli tüübi,
> (2) tuunitavad parameetrid ja
> (3) veamudel.
Muide, kõik veamudelid, millega me edaspidi töötame, modelleerivad igale x-i väärtusele (kaalule) sama suure y-i suunalise varieeruvuse (pikkuste sd). Suurem osa statistikast kasutab eeldusi, mida keegi päriselt tõe pähe ei võta, aga millega on arvutuslikus mõttes lihtsam elada.
Enimkasutatud veamudel on normaaljaotus.
Oletame, et meil on kolm andmepunkti ning me usume, et need andmed on juhuslikult tõmmatud normaaljaotusest või sellele lähedasest jaotusest. Normaaljaotuse mudelit kasutades me sisuliselt deklareerime, et me usume, et kui me oleksime olnud vähem laisad ja 3 mõõtmise asemel sooritanuks 3000, siis need mõõtmised sobituksid piisavalt hästi meie 3 väärtuse peal fititud normaaljaotusega. Seega, me usume, et omades 3 andmepunkti me teame juba umbkaudu, millised tulemused me oleksime saanud korjates näiteks 3 miljonit andmepunkti. Oma mudelist võime simuleerida ükskõik kui palju andmepunkte.
Aga pidage meeles, et selle mudeli fittimiseks kasutame me ainult neid andmeid, mis meil päriselt on — ja kui meil on ainult 3 andmepunkti, on tõenäoline, et fititud mudel ei kajasta hästi tegelikkust.
Halvad andmed ei anna kunagi head tulemust.
Eelnev ei kehti Bayesi mudelite kohta, mis toovad priorite kaudu sisse lisainfot, mis ei kajastu valimiandmetes ja võib analüüsi päästa.
Kuidas panna skeptik uskuma, et statistilised meetodid töötavad halvasti väikestel valimitel? Siin aitab simulatsioon, kus me tõmbame 3-se valimi etteantud populatsioonist ning üritame selle valimi põhjal ennustada selleasama populatsiooni struktuuri. Kuna tegemist on simulatsiooniga, teame täpselt, et populatsioon, kust me tõmbame oma kolmese valimi, on normaaljaotusega, et tema keskväärtus = 0 ja et tema sd = 1. Me fitime oma valimi andmetega 2 erinevat mudelit: normaaljaotuse ja Studenti t jaotuse.

Joonis: juhuvalim normaaljaotusest, mille keskmine=0 ja sd=1 (n=3; andmepunktid on näidatud mustade munadena). Sinine joon - popualtsioon, millest tõmmati valim; punane joon - normaaljaotuse mudel, mis on fititud valimi andmetel; must joon - Studenti t jaotuse mudel, mis on fititud samade andmetega.
Mõlemad mudelid on süstemaatiliselt nihutatud väiksemate väärtuste poole ja alahindavad varieeruvust. t jaotuse mudel on oodatult paksemate sabadega ja ennustab 0-st kaugele palju rohkem väärtusi kui normaaljaotuse mudel. Kuna me teame, et populatsioon on normaaljaotusega, pole väga üllatav, et t jaotus modeleerib seda halvemini kui normaaljaotus.
Igal juhul, mõni teine juhuvalim annaks meile hoopis teistsugused mudelid, mis rohkem või vähem erinevad algsest populatsioonist.
Mis juhtub kui me kasutame oma normaaljaotuse mudelit uute andmete simuleerimiseks? Kui lähedased on need simuleeritud andmed populatsiooni andmetega ja kui lähedased valimi andmetega, millega me normaaljaotuse mudeli fittisime?
set.seed(19) #muudab simulatsiooni korratavaks
#tõmbame 3 juhuslikku arvu normaalhaotusest, mille keskväärtus = 0 ja sd = 1.
df <- tibble(sample_data=rnorm(3))
#fitime normaaljaotuse mudeli valimi keskmise ja sd-ga
mean(df$sample_data); sd(df$sample_data)
[1] -0.3817353
[1] 0.7896821
#simuleerime 1000 uut andmepunkti fititud mudelist
simulated_data <- rnorm(1000, mean(df$sample_data), sd(df$sample_data))
#arvutame simuleeritud andmete keskmise ja sd ning joonistame neist histogrammi
mean(simulated_data); sd(simulated_data); hist(simulated_data)
[1] -0.3848133
[1] 0.7749198

Nagu näha, on uute (simuleeritud) andmete keskväärtus ja SD väga sarnased algsete andmete omale, mida kasutasime mudeli fittimisel. Kahjuks ei ole need aga kaugeltki nii sarnased algsele jaotusele, mille kuju me püüame oma andmete ja mudeli pealt ennustada. Seega on meie mudel üle-fittitud, mis tähendab, et ta kajastab liigselt neid valimi aspekte, mis ei peegelda algse populatsiooni omadusi. Loomulikult ei vasta ükski mudel päriselt tegelikkusele. Küsimus on pigem selles, kas mõni meie mudelitest on piisavalt hea, et olla kasulik. Vastus sellele sõltub, milleks plaanime oma mudelit kasutada.
mean(simulated_data>0); mean(simulated_data>1)
[1] 0.317
[1] 0.037
Kui populatsiooniväärtustest on 50% suuremad kui 0, siis mudeli järgi vaevalt 32%. Kui populatsiooniväärtustest on 16% suuremad kui 1, siis mudeli järgi vaevalt 4%. See illustreerib hästi mudeli kvaliteeti.
library(brms)
sim_t <- rstudent_t(1000, 2, mean(df$sample_data), sd(df$sample_data))
mean(sim_t>0); mean(sim_t>1)
[1] 0.338
[1] 0.11
Samad ennustused t jaotusest on isegi paremad! Aga kumb on ikkagi parem mudel populatsioonile?
normaaljaotuse ja lognormaaljaotuse erilisus
Normaaljaotus ja lognormaaljaotus on erilised sest
keskne piirteoreem ütleb, et olgu teie valim ükskõik millise jaotusega, paljudest valimitest arvutatud aritmeetilised keskmised on alati enam-vähem normaaljaotusega (kui n>30). Selle matemaatilise formalismi tuletus füüsikalisse maailma on nn “elementaarsete vigade hüpotees”, mille kohaselt paljude väikeste üksteisest sõltumatute juhuslike efektide (vigade) summa annab tulemuseks normaaljaotuse. Paraku annavad enamus bioloogilisi mõõtmisi eranditult mitte-negatiivseid tulemusi. Sageli on selliste mõõtmiste tulemuste jaotused ebasümmeetrilised (v.a. siis, kui cv = sd/mean on väike) ja siis on meil sageli tegu lognormaaljaotusega, mis tekkib log-normaalsete muutujate korrutamisest (mitte liitmisest, nagu normaaljaotuse puhul). Keskne piirteoreem 2: suvalise jaotusega muutujate geomeetrilised keskmised on lognormaaljaotusega. Elementaarsete vigade hüpotees 2: Kui juhuslik varieeruvus tekib paljude juhuslike efektide korrutamisel, on tulemuseks lognormaaljaotus. Lognormaaljaotuse elementide (arvude) logaritmimisel saame normaaljaotuse.
Mõlemad jaotused (normaal ja lognormaal) on maksimaalse entroopiaga jaotused. Entroopiat vaadeldakse siin informatsiooni/müra kaudu — maksimaalse entroopiaga süsteem sisaldab maksimaalselt müra ja minimaalselt informatsiooni (Shannoni informatsiooniteooria). See tähendab, et väljaspool oma parameetrite tuunitud väärtusi on need normaal- ja lognormaaljaotused minimaalselt informatiivsed. Näiteks normaaljaotusel on kaks parameetrit, mu ja sigma (ehk keskmine ja standardhälve). Seega, andes normaaljaotusele ette keskväärtuse ja standardhälbe fikseerime üheselt jaotuse ehk mudeli kuju ja samas lisame sinna minimaalselt muud (sooviamtut) informatsiooni. Teised maksimaalse entroopiaga jaotused on eksponentsiaalne jaotus, binoomjaotus ja poissoni jaotus. Maksimaalse entroopiaga jaotused sobivad hästi Bayesi prioriteks sest me suudame paremini kontrollida, millist informatsiooni me neisse surume.
Küsimused, mida statistika küsib
Statistika abil saab vastuseid järgmisetele küsimustele:
kuidas näevad välja teie andmed ehk milline on just teie andmete jaotus, keskväärtus, varieeruvus ja koos-varieeruvus? Näiteks, mõõdetud pikkuste ja kaalude koos-varieeruvust saab mõõta korrelatsioonikordaja abil.
mida me peaksime teie valimi andmete põhjal uskuma populatsiooni parameetri tegeliku väärtuse kohta? Näiteks, kui meie andmete põhjal arvutatud keskmine pikkus on 178 cm, siis kui palju on meil põhjust arvata, et tegelik populatsiooni keskmine pikkus > 185 cm?
mida ütleb statistilise mudeli struktuur teadusliku hüpoteesi kohta? Näiteks, kui meie poolt mõõdetud pikkuste ja kaalude koos-varieeruvust saab hästi kirjeldada kindlat tüüpi lineaarse regressioonimudeliga, siis on meil ehk tõendusmaterjali, et pikkus ja kaal on omavahel sellisel viisil seotud ja eelistatud peaks olema teaduslik teooria, mis just sellise seose tekkimisele bioloogilise mehhanismi annab.
mida ennustab mudel tuleviku kohta? Näiteks, meie lineaarne pikkuse-kaalu mudel suudab ennustada tulevikus kogutavaid pikkuse andmeid. Aga kui hästi?
statistika ülesanne on lähtuvalt piiratud hulgast andmetest ja mudelitest kvantifitseerida parimal võimalikul viisil kõhedust, mida peaksime tundma vastates eeltoodud küsimustele.
Statistika ei vasta otse teaduslikele küsimustele ega küsimustele päris maailma kohta. Statistilised vastused jäävad alati kasutatud andmete ja mudelite piiridesse. Sellega seoses peaksime eelistama hästi kogutud rikkalikke andmeid ja paindlikke mudeleid. Siis on lootust, et hüpe mudeli koefitsientidest päris maailma kirjeldamisse tuleb üle kitsama kuristiku. Bayesil on siin eelis, sest osav statistik suudab koostöös teadlastega priori mudelisse küllalt palju kasulikku infot koguda. Samas, amatöör suudab bayesi abil samavõrra käkki keerata. Mida paindlikum on meetod, seda vähem automaatne on selle mõistlik kasutamine.
2 osa. Kuidas näevad välja teie andmed?
summaarsed statistikud
Summaarne statistik = üks number.
Milliseid statistikuid arvutada ja milliseid vältida, sõltub statistilisest mudelist
summaarse statistika abil iseloomustame a) tüüpilist valimi liiget (keskmist), b) muutuja sisest varieeruvust, c) erinevate muutujate (pikkus, kaal vms) koos-varieeruvust
keskväärtused
Keskväärtust saab mõõta paaril tosinal erineval viisil, millest järgnevalt kasutame kolme või nelja. Enne kui te arvutama kukute, mõelge järele, miks te soovite keskväärtust teada. Kas teid huvitab valimi tüüpiline liige? Kuidas te sooviksite seda tüüpilisust defineerida? Kas valimi keskmise liikmena või valimi kõige arvukama liikmena? või veel kuidagi? See, millist keskväärtust kasutada sõltub sageli andmejaotuse kujust. Sümmeetrilisi jaotusi on lihtsam iseloomustada ja mitmetipulised jaotused on selles osas kõige kehvemad.
Mina eelistan selliseid nõuandeid (mis on rangelt soovituslikud):
Kui valim on normaaljaotusega (histogramm on sümmeetriline), hinda tüüpilist liiget läbi aritmeetilise keskmise (mean).
Muidu kasuta mediaani (median). Kui valim on liiga väike, et jaotust hinnata (aga > 4), eelista mediaani. Mediaani saamiseks järjestatakse mõõdetud väärtused suuruse järgi ja võetakse selle rea keskmine liige. Mediaan on vähem tundlik ekstreemsete väärtuste (outlierite) suhtes kui mean.
Valimi kõige levinumat esindajat iseloomustab mood ehk jaotuse tipp. Seda on aga raskem täpselt määrata ja mitmetipulisel jaotusel on mitu moodi. Töötamisel posterioorsete jaotustega on mood sageli parim lahendus.
[1] 0.6817168

Joonis: Simuleeritud lognormaaljaotusega andmed. Punane joon - mood; sinine joon - mediaan; must joon - aritmeetiline keskmine (mean). Milline neist vastab parimini teie intuitsiooniga nende andmete “keskväärtusest”? Miks?
muutuja sisene varieeruvus
Mean-iga käib kokku standardhälve (SD).
SD on sama ühikuga, mis andmed (ja andmete keskväärtus). Statistikute hulgas eelistatud formaat on mean (SD), mitte mean (+/- SD). 1 SD katab 68% normaaljaotusest, 2 SD – 96% ja 3 SD – 99%. Normaaljaotus langeb servades kiiresti, mis tähendab, et tal on peenikesed sabad ja näiteks 5 SD kaugusel keskmisest paikneb vaid üks punkt miljonist.
Näiteks: inimeste IQ on normaaljaotusega, mean=100, sd=15. See tähendab, et kui sinu IQ=115 (ülikooli astujate keskmine IQ), siis on tõenäosus, et juhuslikult kohatud inimene on sinust nutikam, 18% ((100% - 68%)/2 = 18%).
Kui aga “tegelikul” andmejaotusel on “paks saba” või esinevad outlierid, siis normaaljaotust eeldav mudel tagab ülehinnatud SD ja seega ülehinnatud varieeruvuse. Kui andmed saavad olla ainult positiivsed, siis SD > mean/2 viitab, et andmed ei sobi normaaljaotuse mudeliga (sest mudel ennustab negatiivsete andmete esinemist küllalt suure sagedusega).
Normaaljaotus on defineeritud ka mõnede teiste jaotuste jaoks peale normaaljaotuse
(Poissioni jaotus, binoomjaotus).
Funktsioon sd() ja selle taga olev valem, mis on loodud normaaljaotuse tarbeks,
ja neid alternatiivseid standardhälbeid ei arvuta.
Seega tasub meeles pidada, et tavapärane sd kehtib normaaljaotuse mudeli piirides ja ei kusagil mujal!
Kui andmed ei sobi normaaljaotusesse siis võib pakkuda kahte alternatiivset lahendust:
(1) logaritmi andmed.
Kui logaritmimine muudab andmed normaalseks, siis saab logaritmitud andmetest arvutada mean-i ja SD ja seejärel mõlemad anti-logaritmida. Sellisel juhul avaldad sa lõpuks geomeetrilise keskmise ja multiplikatiivse SD (multiplikatiivne SD = geom mean x SD; geom mean/SD). Geomeetriline keskmine on alati väiksem kui aritmeetiline keskmine. Lisaks on SD interval nüüd asümmeetriline ja SD on alati > 0. Nagu ennegi, 68% lognormaalsetest andmetest jääb 1SD vahemikku ning 95.5% andmetest jääb 2SD vahemikku.
lognormaalsete andmete tavapärane iseloomustus keskmise ja standardhälbega: mean(sd) on 1.8(1.9). See sd interval on sümmeetriline, ehkki andmete jaotus on vägagi ebasümmeetriline. Lisaks ennustab standardhälve, mis on suurem kui keskväärtus, suure sagedusega negatiivseid väärtusi. Sageli on aga negatiivsed muutuja väärtused võimatud (näiteks nädalas suitsetatud sigarettide arv). See on näide halvast mudelist!
Juhul kui tegu lognormaalsete andmetega on meil võimalus kasutada palju paremat mudelit varieeruvusele - multiplikatiivset standardhälvet:
Tavalise aritmeetitilise keskmise asemel on meil nüüd geomeetriline keskmine. Võrdluseks on antud ka tavaline (aritmeetiline) keskmine ja (aditiivne) SD. Additiivne SD on selle jaotuse kirjeldamiseks selgelt ebaadekvaatne (vt jaotuse pilti ülalpool ja võrdle mulitplikatiivse SD-ga).
Kuidas aga töötab multiplikatiivne standardhälve normaaljaotusest pärit andmetega? Kui normaalsete andmete peal multiplikatiivse sd rakendamine viib katastroofini, siis pole sel statistikul suurt praktilist kasutusruumi.
set.seed(5363)
norm_andmed <- rnorm(3, 100, 20)
multiplicative_sd(norm_andmed)
Nagu näha, on multiplikatiivse sd kasutamine normaalsete andmetega üsna ohutu (kuigi, ainult niikaua, kuni meil puuduvad negatiivsed andmed). Seega, kui sa ei ole kindel, kas tegu on normaaljaotusega või lognormaaljaotusega, arvesta, et lognormaaljaotus on bioloogias üsna tavaline (eriti ensüümreaktsioonide ja kasvuprotsesside juures). Seega on mõistlik alati kasutada multiplicative_sd() funktsiooni ja kui mõlema SD väärtused on sarnased, siis võib loota, et andmed on normaalsed ning saab avaldada tavapärase additiivse SD refereede rõõmuks.
kui n < 10, siis mõlemad SD-d alahindavad tehnilistel põhjustel tegelikku sd-d. Ettevaatust väikeste valimitega!
muutujate koos-varieeruvus
Andmete koos-varieeruvust mõõdetakse korrelatsiooni abil. Tulemuseks on üks number - korrelatsioonikordaja r, mis varieerub -1 ja 1 vahel.
r = 0 – kahte tüüpi mõõtmised (x=pikkus, y=kaal) samadest mõõteobjektidest varieeruvad üksteisest sõltumatult.
r = 1: kui ühe muutuja väärtus kasvab, kasvab ka teise muutuja väärtus alati täpselt samas proportsioonis.
r = -1: kui ühe muutuja väärtus kasvab, kahaneb teise muutuja väärtus alati täpselt samas proportsioonis.
Kui r on -1 või 1, saame me x väärtust teades täpselt ennustada y väärtuse (ja vastupidi, teades y väärrust saame täpselt ennustada x väärtuse).
Kuidas tõlgendame aga tulemust r = 0.9? Mitte kuidagi. Selle asemel tõlgendame r2 = 0.9**2 = 0.81 – mis tähendab, et x-i varieeruvus suudab seletada 81% y varieeruvusest ja vastupidi, et Y-i varieeruvus suudab seletada 81% X-i varieeruvusest.
#correlation<-cor.test(iris$Sepal.Length, iris$Sepal.Width, na.rm=T, method = "pearson") # a list of 9
#names(correlation)
#str(correlation)
#correlation$conf.int
cor(iris$Sepal.Length, iris$Sepal.Width, use="complete.obs")
[1] -0.1175698
Korrelatsioonikordaja väärtus sõltub mitte ainult andmete koos-varieeruvusest vaid ka andmete ulatusest. Suurema ulatusega andmed X ja/või Y teljel annavad keskeltläbi 0-st kaugemal oleva korrelatsioonikordaja. Selle pärast sobib korrelatsioon halvasti näiteks korduskatsete kooskõla mõõtmiseks.
Lisaks, korrelatsioonikordaja mõõdab vaid andmete lineaarset koos-varieeruvust: kui andmed koos-varieeruvad mitte-lineaarselt, siis võivad ka väga tugevad koos-varieeruvused jääda märkamatuks.
Kõik summaarsed statistikud kaotavad enamuse teie andmetes leiduvast infost – see kaotus on õigustatud ainult siis, kui teie poolt valitud statistik iseloomustab hästi andmete sügavamat olemust (näiteks tüüpilist mõõtmistulemust või andmete varieeruvust).
#Kuidas arvutada correlatsioonimaatriksit koos adjusteeritud p väärtustega
#numeric columns only!
print(psych::corr.test(iris[-5], use="complete"), short = FALSE)
2.2 EDA — eksploratoorne andmeanalüüs
Kui ühenumbriline andmete summeerimine täidab eelkõige kokkuvõtliku kommunikatsiooni eesmärki, siis EDA on suunatud teadlasele endale. EDA eesmärk on andmeid eelkõige graafiliselt vaadata, et saada aimu 1) andmete kvaliteedist ja 2) lasta andmetel “sellisena nagu nad on” kõneleda ja sugereerida uudseid teaduslikke hüpoteese. Neid hüpoteese peaks siis testima formaalse statistilise analüüsi abil.
EDA: mida rohkem graafikuid, seda rohkem võimalusi uute mõtete tekkeks!
Kõigepealt vaatame andmeid numbrilise kokkuvõttena:
psych::describe(iris)
vars n mean sd median trimmed mad min max range skew kurtosis
Sepal.Length 1 150 5.84 0.83 5.80 5.81 1.04 4.3 7.9 3.6 0.31 -0.61
Sepal.Width 2 150 3.06 0.44 3.00 3.04 0.44 2.0 4.4 2.4 0.31 0.14
Petal.Length 3 150 3.76 1.77 4.35 3.76 1.85 1.0 6.9 5.9 -0.27 -1.42
Petal.Width 4 150 1.20 0.76 1.30 1.18 1.04 0.1 2.5 2.4 -0.10 -1.36
Species* 5 150 2.00 0.82 2.00 2.00 1.48 1.0 3.0 2.0 0.00 -1.52
se
Sepal.Length 0.07
Sepal.Width 0.04
Petal.Length 0.14
Petal.Width 0.06
Species* 0.07
Millised korrelatsioonid võiksid andmetes esineda?
library(corrgram) #PCA for ordering
corrgram(iris, order=TRUE,
lower.panel = panel.pts,
upper.panel = panel.ellipse,
diag.panel = panel.density,
main="Correlogram of diamond dataset")

Kuidas uurida muutuja sisest varieeruvust
Muutuja - midagi, mida mõõdeti (näiteks mõõteobjektide kaal). Kui iga muutuja kohta on vaid üks number, mida plottida, kasuta Cleveland plotti:
dd <- diamonds %>% group_by(clarity) %>% summarise(number_of_diamonds=n())
dd %>% ggplot(aes(x=number_of_diamonds,
y=reorder(clarity, number_of_diamonds))) +
geom_point(size=3) +
theme_bw() +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_line(colour="grey60", linetype="dashed")) +
labs(y="clarity")

Ploti valik sõltub valimi suurusest.
N < 20 - ploti iga andmepunkt eraldi (stripchart(), plot()) ja keskmine või mediaan.
20 > N > 100: geom_dotplot() histogrammi vaates
N > 100: geom_histogram(), geom_density() — nende abil saab ka 2 kuni 6 jaotust võrrelda
Mitme jaotuse kõrvuti vaatamiseks kui N > 15: geom_boxplot() or, when N > 50, geom_violin(), geom_joy()
ToothGrowth <- ToothGrowth
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
p<-ggplot(ToothGrowth, aes(x=dose, y=len)) +
geom_dotplot(binaxis='y', stackdir='center')
p

# Change dotsize and stack ratio, add line or dot for median
ggplot(ToothGrowth, aes(x=dose, y=len)) +
geom_dotplot(binaxis='y', stackdir='center',
stackratio=1.5, dotsize=0.7)+
stat_summary(fun.y = median, geom = "point", shape = 95,
color = "red", size = 15) +
theme_tufte()

p + stat_summary(fun.y=median, geom="point", shape=18,
size=5, color="red")

#add mean and SD
p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange", color="red")

p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1),
geom="errorbar", color="red", width=0.2) +
stat_summary(fun.y=mean, geom="point", size=3, color="red")

Use a custom summary function :

# Change dot plot colors by groups
p<-ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) +
geom_dotplot(binaxis='y', stackdir='center')
p

It is also possible to change manually dot plot colors using the functions :
scale_fill_manual() : to use custom colors
scale_fill_brewer() : to use color palettes from RColorBrewer package
scale_fill_grey() : to use grey color palettes
p + scale_x_discrete(limits=c("0.5", "2"))

Dotplot kui histogram:
ggplot(iris, aes(Sepal.Length)) + geom_dotplot()

Histogram:
ggplot(iris, aes(Sepal.Length)) +
geom_histogram(bins = 10, color="white", fill = "navyblue")

library(ggthemes)
d <- iris # Full data set
d_bg <- d[, -5] # Background Data - full without the 5th column (Species)
ggplot(data = d, aes(x = Sepal.Width, fill = Species)) +
geom_histogram(data = d_bg, fill = "grey", alpha=0.8, bins=10) +
geom_histogram(colour = "black", bins=10) +
facet_grid(Species~.) +
guides(fill = FALSE) + # to remove the legend
theme_tufte() # for clean look overall

density plot:
iris%>%ggplot()+
geom_density(aes(Sepal.Width, fill=Species, color=Species, alpha=0.5))+
theme_tufte()

joyplot võimaldab kõrvuti panna isegi sadu density plotte
library(ggjoy)
ggplot(iris, aes(x=Sepal.Length, y=Species, fill=Species)) +
geom_joy(scale=4, rel_min_height=0.01, alpha=0.9) +
theme_joy(font_size = 13, grid=TRUE) +
theme(legend.position = "none")

Boxplot:
ggplot(iris, aes(Species, Sepal.Width, fill=Species)) + geom_boxplot()

violin plot plus jitterplot:
ggplot(iris, aes(Species, Sepal.Width)) +
geom_violin(aes(fill=Species)) +
geom_jitter(width = 0.1, alpha=0.4, size=0.5)

Kahe muutuja koos-varieerumine
ggplot(data = diamonds, aes(x = depth, y = price)) +
geom_point(size=0.1, alpha=0.1) +
geom_density2d()

Fit a linear model and plot the dots and model:
ggplot(data=iris, aes(Sepal.Width, Petal.Width))+
geom_point()+
geom_smooth(method="lm", color="red")

Joongraafikud
Joonetüübid : “blank”, “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, “twodash”.
df2 <- data.frame(sex = rep(c("Female", "Male"), each=3),
time=c("breakfeast", "Lunch", "Dinner"),
bill=c(10, 30, 15, 13, 40, 17) )
# Change line types
ggplot(data=df2, aes(x=time, y=bill, group=sex)) +
geom_line(linetype="dashed")+
geom_point()

# Change line colors and sizes
ggplot(data=df2, aes(x=time, y=bill, group=sex)) +
geom_line(linetype="dotted", color="red", size=2)+
geom_point(color="blue", size=3)

Muudab tüüpi automaatselt muutuja sex taseme järgi
# Change line types by groups (sex)
ggplot(df2, aes(x=time, y=bill, group=sex)) +
geom_line(aes(linetype=sex))+
geom_point()+
theme(legend.position="top")

# Change line types + colors
ggplot(df2, aes(x=time, y=bill, group=sex)) +
geom_line(aes(linetype=sex, color=sex))+
geom_point(aes(color=sex))+
theme(legend.position="top")

Muuda jooni käsitsi:
scale_linetype_manual() : joone tüüp
scale_color_manual() : joone värv
scale_size_manual() : joone laius
# Set line types manually
ggplot(df2, aes(x=time, y=bill, group=sex)) +
geom_line(aes(linetype=sex))+
geom_point()+
scale_linetype_manual(values=c("twodash", "dotted"))+
theme(legend.position="top")

# Change line colors and sizes
ggplot(df2, aes(x=time, y=bill, group=sex)) +
geom_line(aes(linetype=sex, color=sex, size=sex))+
geom_point()+
scale_linetype_manual(values=c("twodash", "dotted"))+
scale_color_manual(values=c('#999999','#E69F00'))+
scale_size_manual(values=c(1, 1.5))+
theme(legend.position="top")

Kokkuvõte:
Andmepunktide plottimine säilitab maksimaalselt andmetes olevat infot (nii kasulikku infot kui müra). Aitab leida outliereid (valesti sisestatud andmeid, valesti mõõdetud proove jms). Kui valim on väiksem kui 20, piisab täiesti üksikute andmepunktide plotist koos mediaaniga. Dot-plot ruulib.
Histogramm – kõigepealt mõõtskaala ja seejärel andmed jagatakse võrdse laiusega binnidesse ja plotitakse binnide kõrgused. Bin, kuhu läks 20 andmepunkti on 2X kõrgem kui bin, kuhu läks 10 andmepunkti. Samas, bini laius/ulatus mõõteskaalal pole teile ette antud – ja sellest võib sõltuda histogrammi kuju. Seega on soovitav proovida erinevaid bini laiusi ja võrrelda saadud histogramme. Histogramm sisaldab vähem infot kui dot plot, aga võimaldab paremini tabada seaduspärasid & andmejaotust & outliereid suurte andmekoguste korral.
Density plot. Silutud versioon histogrammist, mis kaotab infot aga toob vahest välja signaali müra arvel. Density plotte on hea kõrvuti vaadelda joy ploti abil.
Box-plot – sisaldab vähem infot kui histogramm, kuid neid on lihtsam kõrvuti võrrelda. Levinuim variant (kuid kahjuks mitte ainus) on Tukey box-plot – mediaan (joon), 50% IQR (box) ja 1,5x IQR (vuntsid), pluss outlierid eraldi punktidena.
Violin plot – informatiivsuselt box-ploti ja histogrammi vahepeal – sobib paljude jaotuste kõrvuti võrdlemiseks
Line plot – kasuta ainult siis kui nii X kui Y teljele on kantud pidev väärtus (pikkus, kaal, kontsentratsioon, aeg jms). Ära kasuta, kui teljele kantud punktide vahel ei ole looduses mõtet omavaid pidevaid väärtusi (näiteks X teljel on katse ja kontroll või erinevad valgumutatsioonid, mille aktiivsust on mõõdetud)
Suhete võrdlemine (pie vs bar)
Cleveland plot countide jaoks. Kasuta Barplotti ainult siis, kui Cleveland plot vm plot mingil põhjusel ei sobi. Barplot võiks olla viimane valik.
Informatsiooni hulk kahanevalt: iga andmepunkt plotitud (dot plot) -> histogram -> density plot/violin plot -> box plot -> bar plot standardhälvetega -> Cleveland plot (barplot ilma veapiirideta)
LS0tCnRpdGxlOiAiQmF5ZXNpYWFubGlrIHN0YXRpc3Rpa2EiCm91dHB1dDoKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKYGBge3IsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShwc3ljaCkKbGlicmFyeShnZ2pveSkKbGlicmFyeShjb3JyZ3JhbSkKbGlicmFyeShtb2RlbHIpCmxpYnJhcnkoYnJvb20pCmBgYAoKI1Npc3NlanVoYXR1cwoKU2VlIMO1cGlrIG9uIGtpcmp1dGF0dWQgaW5pbWVzdGVsZSwga2VzIGthc3V0YXZhZCwgbWl0dGUgZWkgdXVyaSwgc3RhdGlzdGlrYXQuIMOVcGlrdSBrYXN1dGFqYSBwZWFrcyBvbGVtYSB2w7VpbWVsaW5lIHTDtsO2dGFtYSBSIGtlc2trb25uYXMgKHZ0IG1laWUgZWVzdGlrZWVsc2V0IFItaSBrb25zcGVrdGkpLiBNZWllIGzDpGhlbmVtaXNlZCBzdGF0aXN0aWthIMO1cGV0YW1pc2VsZSBvbiBhcnZ1dHVzbGlrdWQsIG1pcyB0w6RoZW5kYWIsIGV0IG1lIGVlbGlzdGFtZSBtZWV0b2RpIG1hdGVtYWF0aWxpc2UgYWx1c2UgYXNlbWVsIMO1cGV0YWRhIHNlbGxlIGthc3V0YW1pc3QgamEgdHVsZW11c3RlIHTDtWxnZW5kYW1pc3QuIFNlZSDDtXBpayBvbiBiYXllc2lhYW5saWsgamEgZWkgw7VwZXRhIHNhZ2VkdXNsaWtrdSBzdGF0aXN0aWthdC4gTWUgdXN1bWUsIGV0IG5paSBvbiBsaWh0c2FtIGphIHR1bHVzYW0gc3RhdGlzdGlrYXQgw7VwcGlkYSBqYSBldCBCYXllc2kgc3RhdGlzdGlrYXQga2FzdXRhZGVzIHNhYWIgcmFodWxkYWRhIDk5JSB0ZWllIHRlZ2VsaWtlc3Qgc3RhdGlzdGlsaXN0ZXN0IHZhamFkdXN0ZXN0IHBhcmVtaW5pLCBrdWkgc2VlIG9uIHbDtWltYWxpayBrbGFzc2lrYWxpc3RlIHNhZ2VkdXNsaWtlIG1lZXRvZGl0ZWdhLiBNZSB1c3VtZSBrYSwgZXQga3VpZ2kgcHJhZWd1c2VkIGtpaXJlZCBhcmVuZ3VkIGJheWVzaSBzdGF0aXN0aWthcyBvbiB0w6RuYXNla3MganViYSB2aWludWQgc2VsbGUgc3V1cmVsIG3DpMOkcmFsIHRhdmFrYXN1dGFqYWxlIGvDpHR0ZXNhYWRhdmFzc2Ugdm9ybWksIHRvb3ZhZCBsw6RoaWFhc3RhZCBzZWxsZXMgdmFsbGFzIHZlZWwgc3V1cmkgbXV1dHVzaS4gTmVuZGUgbXV1dHVzdGVnYSBrb29zIHBlYWIgYXJlbmVtYSBrYSBiYXllc2kgw7VwZXRhbWluZS4gCgpNZSBrYXN1dGFtZSBqw6RyZ21pc2kgUi1pIHBha2V0dGUsIG1pcyBvbiBrw7VpayBsb29kdWQgYmF5ZXNpIG11ZGVsaXRlIHJha2VuZGFtaXNlIGxpaHRzdXN0YW1pc2VrczogcmV0aGlua2luZywgYnJtcywgcnN0YW5hcm0sIEJheWVzaWFuRmlyc3RBaWQgamEgYmF5ZXNwbG90LiBMaXNha3MgdmVlbCBiYXllc2Jvb3QgYm9vdHN0cmFwaW1pc2Vrcy4gQmF5ZXNpIGFydnV0dXN0ZWtzIGthc3V0YXZhZCBuZWVkIHBha2V0aWQgU3RhbiBqYSBKQUdTIG1jbWMgc8OkbXBsZXJlaWQgKHZpaW1hc3Qga8O8bGwgYWludWx0IEJheWVzaWFuRmlyc3RBaWQgcGFrZXQpLiBTZWxsZSDDtXBpa3UgdmFsbWltaXNlbCBvbiBrYXN1dGF0dWQgTWNFbHJlYXRoaSwgS3J1c2Noa2UgamEgR2VsbWFuaSDDtXBpa3VpZCAoVklJVEVEKS4KCkt1bmEgb3NhZGVsZSBsdWdlamF0ZWxlIG9uIGlsbXNlbHQgw7VwZXRhdHVkIHNhZ2VkdXNsaWtrdSBzdGF0aXN0aWthdCwgdsO1cmRsZW1lIGrDpHJnbmV2YWx0IGzDvGhpZGFsdCBzYWdlZHVzbGlra3UgamEgYmF5ZXNpIHN0YXRpc3RpbGlzaSBwYXJhZGlnbWFzaWQsIGV0IG9sZWtzIHBhcmVtaW5pIGFydXNhYWRhdiwgbWlsbGVzdCBzZWxsZSDDtXBpa3UgbHVnZWphIGlsbWEgasOkw6RiLiBJbmltZXNlZCwga2VzIGVpIG9sZSDDtXBwaW51ZCBzYWdlZHVzbGlra3Ugc3RhdGlzdGlrYXQgdsO1aXZhZCByYWh1bWVlbGkgc2VsbGUgb3NhIHZhaGVsZSBqw6R0dGEgbmluZyBvdHNlbWFpZCBzaWlyZHVkYSBvc2EgMS4ganV1cmRlLgoKIyNBamFsb29zdCBqYSB0w7VlbsOkb3N1c2VzdAoKQmF5ZXNpYWFubGlrIGphIHNhZ2VkdXNsaWsgc3RhdGlzdGlrYSBzw7xubml0YXRpIMO8a3N0ZWlzZSBqw6RyZWwgc2FtYSBlbWEgcG9vbHQuIFRlbWEgbmltaSBvbiBMYXBsYWNlIGphIHRhIGFyZW5kYXMgdsOkbGphIGvDtWlnZXBlYWx0IGJheWVzaSBzdGF0aXN0aWthIGFsdXNlZCBuaW5nIHNlZWrDpHJlbCBzYWdlZHVzbGlrdSBzdGF0aXN0aWthIG9tYWQuIFNhZ2VkdXNsaWt1IHN0YXRpc3Rpa2EgdGVra2ltaXNlIGphIGhpbGlzZW1hIMO1aXRzZW5ndSBwZWFtaW5lIHDDtWhqdXMgb2xpIGFydnV0dXNsaWsgbGlodHN1cy4gTGlodHNhbHQgYmF5ZXNpIG1lZXRvZGl0ZWdhIGVpIG9sbnVkIGFydnV0dXN0ZWhuaWxpc3RlbCBww7VoanVzdGVsIHbDtWltYWxpayBrb3JyYWxpa3VsdCB0ZWFkdXN0IHRlaGEgZW5uZSAxOTkwLW5kYWlkIGFhc3RhaWQsIG1pbCBwZXJzb25hYWxhcnZ1dGl0ZSBraWlyZSBsZXZpayBhbGdhdGFzIHN1dXJlIGJ1dW1pIG5lbmRlIG1lZXRvZGl0ZSBhcmVuZGFtaXNlcy4gUHJhZWd1IG9uIG1hYWlsbWFzIGJheWVzaSBqYSBzYWdlZHVzbGlra3Ugc3RhdGlzdGlrYXQgdW1iZXMgcG9vbGVrcyAodsOkaGVtYWx0IHV1dGUgbWVldG9kaXRlIGFyZW5kdXN0w7bDtiBwb29sZSBwZWFsdCksIEVlc3RpcyBhZ2EgYmF5ZXNpIHN0YXRpc3Rpa2EgMjAxNyBhYXN0YSBzZWlzdWdhIHBlYWFlZ3UsIGV0IHB1dWR1Yi4gCgpTdGF0aXN0aWthIG9uIGFpbnVsYWFkbmUgdGVhZHVzIHNlbGxlIHBvb2xlc3QsIGV0IHNlZSBvbiBhbGF0ZXMgb21hIGzDpHRldGVzdCAxOC4gc2FqYW5kaWwgbGFoa25lbnVkIGthaGVzIHN1dW5hcywgbWlzIGxhaGVuZGF2YWQgc2FtdSB0ZWFkdXNsaWtrZSBrw7xzaW11c2kgYWdhIHNlbGxlc3QgaG9vbGltYXRhIHN1dXJlcyBvc2FzIMO8a3N0ZWlzZWdhIGVpIGhhYWt1LiBOZWVkIGtha3Mgc3V1bmRhIG9uIEJheWVzaSBzdGF0aXN0aWthIGphIHNhZ2VkdXNsaWsgc3RhdGlzdGlrYS4gTWVpZSBvbGVtZSBiYXllc2lhYW5pZCBzZWxsZXMgbcO1dHRlcywgZXQgdsO1aW1hbHVzZSBrb3JyYWwgZWVsaXN0YW1lIG1lIG9tYSB0w7bDtnMgYmF5ZXNpIHN0YXRpc3Rpa2F0LCBqYSBhaW51bHQgc2lpcywga3VpIHNlZGEgb24gbGlpZ2Ega2VlcnVsaW5lIHJha2VuZGFkYSAodsO1aSBrdWkgbWVpbGUgZWkgbWVlbGRpIGluaW1lbmUsIGtlbGxlbGUgbWUgc3RhdGlzdGlrYXQgdGVlbWUpLCBrYXN1dGFtZSBzYWdlZHVzbGlra2UgbWVldG9kZWlkLiDDlW5uZWtzIHR1bGViIHNlZGEgw7xoYSBoYXJ2ZW1pbmkgZXR0ZS4KCiAgICAgIFN0YXRpc3Rpa2FzdCBsZWlhYiBtw7VuZWQgbWVldG9kaXRlIGtsYXNzaWQsIG1pZGEgdsO1aWIgZWR1a2FsdCB2YWFkYXRhIG5paQogICAgICBzYWdlZHVzbGlrdSBrdWkgYmF5ZXNpYWFubGlrdSBtw6R0dGEgb3RzYXN0OiBlcml0aSBib290c3RyYXBwaW1pbmUgamEgb3NhZAogICAgICBGYWxzZSBEaXNjb3ZlcnkgUmF0ZS1pIGFydnV0YW1pc2UgbWVldG9kaWQuIAogICAgICBBZ2EgbmVlZCBvbiBwaWdlbSBlcmFuZGlkLCBtaXMga2lubml0YXZhZCByZWVnbGl0LgoKS2FoZSBzdGF0aXN0aWthIHDDtWhpbGluZSBlcmluZXZ1cyBlaSB0dWxlIG1pdHRlIG1hdGVtYWF0aWthc3QgLS0tIG3DtWxlbWFkIGhhcnVkIGzDpGh0dXZhZCBzYW1hZGVzdCB0w7VlbsOkb3N1c3Rlb29yaWEgYWtzaW9vbWlkZXN0IGphIG5lbmRlIHZhaGVsIHB1dWR1dmFkIG1hdGVtYWF0aWxpc2VkIGxhaGthcnZhbXVzZWQgLS0tIHZhaWQgdMO1ZW7DpG9zdXNlIHTDtWxnZW5kdXNlc3QuIAoKQmF5ZXNpIHTDtWxnZW5kdXNlcyBvbiB0w7VlbsOkb3N1cyBvbiBrYXMgw7xrc2lrdGVhZGxhc2UgdsO1aSAodsOkaGVtYXRlIGFydmF0ZXMpIHRlYWR1c8O8bGRzdXNlIHVzdSBtw6TDpHIgbWluZ2kgaMO8cG90ZWVzaSBrZWh0aW1pc3NlLiBIw7xwb3RlZXMgdsO1aWIgbsOkaXRla3Mgb2xsYSwgZXQgasOkcmdtaXNlIGp1dWxpa3V1IHNhZGVtZXRlIGh1bGsgVmlsc2FuZGlsIGrDpMOkYiB2YWhlbWlra3UgMjIga3VuaSAzNCBtbS4gS3VpIEJheWVzaSBhcnZ1dHVzIGFubmFiIHNlbGxlIGjDvHBvdGVlc2kgdMO1ZW7DpG9zdXNla3MgMC41Nywgc2lpcyBvbGVtZSBtZSBzZWxsZSB0ZWFkbWlzZSBuYWphbCBuw7V1cyBtYWtzbWEgbWl0dGUgcm9oa2VtIGt1aSA1NyBzZW50aSBraWhsdmVvIGVlc3QsIG1pbGxlIGFsdXNlbCBtYWtzdGFrc2UganVodWwsIGt1aSBzZWUgaMO8cG90ZWVzIHTDtWVzZWtzIG9zdXR1YiwgdsOkbGphIDEgRVVSIChqYSBtZSBzYWFtZSB2w6RoZW1hbHQgNDMgc2VudGkga2FzdW1pdCkuICAKClNhZ2VkdXNsaWt1ZCBzdGF0aXN0aWt1ZCB1c3V2YWQsIGV0IHNlbGxpbmUgdMO1ZW7DpG9zdXNlIHTDtWxnZW5kdXMgb24gZWJhdGVhZHVzbGlrLCBrdW5hIHNlZSBvbiAic3ViamVrdGlpdm5lIi4gT24gdsO1aW1hbGlrLCBldCBuIHRlYWRsYXN0IGFydnV0YXZhZCBrb3JyZWt0c2VsdCBzYW1hZGUgYW5kbWV0ZSBww7VoamFsIG4gZXJpbmV2YXQgdMO1ZW7DpG9zdXN0IGphIHVzdXZhZCBzZWVnYSBzYW1hZGUgdMO1ZW5kaXRlIHDDtWhqYWwgZXJpbmV2YWlkIGFzanUuIFNlZSB2w7VpYiBqdWh0dWRhIHNpaXMsIGt1aSBuYWQgYWxndXNlcyBsw6RodHV2YWQgdsOkZ2EgZXJpbmV2YXRlc3QgdGF1c3RhdXNrdW11c3Rlc3Qgb21hIGjDvHBvdGVlc2lkZSBrZWh0aW1pc2Uga29odGEuIEt1aSB0ZSB1c3V0ZSwgZXQgdGVpZSB0YXVzdGF0ZWFkbWlzZWQgZWkgdG9oaSBtaW5naWwganVodWwgbcO1anV0YWRhIGrDpHJlbGR1c2ksIG1pcyB0ZSBvbWEgYW5kbWV0ZSBww7VoamFsIHRlZXRlLCBzaWlzIHRlIGVpIG9sZSBiYXllc2lhYW4uIFNlbCBqdWh1bCBwYWt1YiBhbHRlcm5hdGlpdmkgc2FnZWR1c2xpayB0w7VlbsOkb3N1c2UgdMO1bGdlbmR1cy4gU2FnZWR1c2xpayB0w7VlbsOkb3N1cyBvbiBkZWZpbmVlcml0dWQga3VpIHRlYXR1ZCB0w7zDvHBpIGFuZG1ldGUgZXNpbmVtaXNlIHBpa2FhamFsaW5lIHN1aHRlbGluZSBzYWdlZHVzLiBOw6RpdGVrcywga3VpIG1lIHZpc2thbWUgbcO8bnRpIHBhbGp1IGtvcmRpLCBzaWlzIHBlYWtzIGt1bGxpZGUgKHbDtWkga2lyamFkZSkgc3VodGVsaW5lIHNhZ2VkdXMgbWVpbGUgYW5kbWEgc2VsbGUgbcO8bmRpIHTDtWVuw6Rvc3VzZSBsYW5nZWRhIGtpcmkgw7xsZXZhbC4gU2VsbGluZSB0w7VlbsOkb3N1cyBvbiBvbWlzdGF0YXYgYWludWx0IHPDvG5kbXVzdGVsZSwgbWlsbGUgZXNpbmVtaXNlbCBvbiBzYWdlZHVzLiBUZWFkdXNsaWsgdGVvb3JpYSBlaSBvbGUgc2VsbGluZSBzw7xuZG11cy4gU2VlZ2EgZWkgb2xlIHNhZ2VkdXNsaWt1cyBzdGF0aXN0aWthcyB2w7VpbWFsaWsgcsOkw6RraWRhIGthIGjDvHBvdGVlc2kga2VodGltaXNlIHTDtWVuw6Rvc3VzZXN0LiBTYWdlZHVzbGlrIGxhaGVuZHVzIG9uLCBzZWxsZSBhc2VtZWwsIGV0IHLDpMOka2lkYSBtZWllIGjDvHBvdGVlc2kgdMO1ZW7DpG9zdXNlc3QgbWVpZSBhbmRtZXRlIGtvcnJhbCwgcsOkw6RraWRhIGFuZG1ldGUsIG1pcyBzYXJuYW5ldmFkIG1laWUgYW5kbWV0ZWdhLCBlc2luZW1pc2UgdMO1ZW7DpG9zdXNlc3QgdGVhdHVkIGjDvHBvdGVlc2kgKG1pcyBhZ2EgZWkgb2xlIG1laWUgaMO8cG90ZWVzKSBrZWh0aW1pc2Uga29ycmFsLiBTZWVnYSBvbWlzdGF0YWtzZSBzYWdlZHVzICg9IHTDtWVuw6Rvc3VzKSBhbmRtZXRlbGUsIG1pdHRlIGjDvHBvdGVlc2lkZWxlLiBKw6RyZ25ldmFsdCB0b29tZSBuw6RpdGUsIGt1aWRhcyBiYXllc2lhYW4gamEgc2FnZWR1c2xpayBzdGF0aXN0aWsgbGFoZW5kYXZhZCBzYW1hIMO8bGVzYW5kZS4KCiMjI07DpGlkZToga2FoZSBncnVwaSB2w7VyZGx1cwoKbWVpbCBvbiAyIGdydXBwaSwga2F0c2UgamEga29udHJvbGwsIG1pbGxlc3Qga3VtbWFnaXMgbiBtw7XDtXRtaXN0IGphIG1lIHNvb3ZpbWUgdGVhZGEsIGthcyBrYXRzZXRpbmdpbXVzIG3DtWp1dGFiIG3DtcO1dG1pc3R1bGVtdXN0IHBpaXNhdmFsdCwgZXQgb2xsYSB0ZWFkdXNsaWt1bHQgaHV2aXRhdi4gTWUgZWVsZGFtZSwgZXQgYW5kbWVkIG9uIG5vcm1hYWxqYW90dXNlZ2EgamEgZXQgbiBlaSBvbGUgdsOkZ2EgdsOkaWtlLgoKIyMjI0JheWVzaWFhbiAKU3RhdGlzdGlsaW5lIGvDvHNpbXVzIG9uIEJheWVzaWFhbmlsIGphIHNhZ2VkdXNsaWt1bCBzdGF0aXN0aWt1bCBzYW1hOiBrYXMgamEga3VpIHBhbGp1IGVyaW5ldmFkIGthaGUgZ3J1cGkga2Vza3bDpMOkcnR1c2VkPyBCYXllc2lhYW4gYWx1c3RhYiBzZWxsZXN0LCBldCBlaGl0YWIga2FrcyBtdWRlbGl0OiBhbmRtZXRlIG11ZGVsIGphIHRhdXN0YXRlYWRtaXN0ZSBtdWRlbC4gS3VpIGFuZG1lZCBvbiBub3JtYWFsamFvdHVzZWdhIHNpaXMgb24ga2EgYW5kbWVtdWRlbCBub3JtYWFsamFvdHVzLiBUw6Rwc2VtYWx0LCBhbmRtZW11ZGVsIG1vZGVsZWVyaWIsIG1pZGEgbWVpZSBhbmRtZXRlIHDDtWhqYWwgc2FhYiDDtmVsZGEgc2VsbGUgcG9wdWxhdHNpb29uaSwga3VzdCBhbmRtZWQga29yamF0aSwga2Vza3bDpMOkcnR1c2Uga29odGEuIFNlZSBtdWRlbCBvbiBub3JtYWFsamFvdHVzLCBtaWxsZSBrZXNrdsOkw6RydHVzIHbDtXJkdWIgdmFsaW1pYW5kbWV0ZSBrZXNrdsOkw6RydHVzZWdhIGphIHN0YW5kYXJkaMOkbHZlIHbDtXJkdWIgdmFsaW1pIHN0YW5kYXJkaMOkbHZlZ2EsIG1pcyBvbiBqYWdhdHVkIHJ1dXRqdXVyZWdhIG4tc3QgKFNFTSA9IHNkKHZhbGltKS9zcXJ0KG4pKS4gCgpUYXVzdGF0ZWFkbWlzdGUgbXVkZWwgb24gc2FnZWxpIHNhbXV0aSBub3JtYWFsamFvdHVzLiBLdWkgbWVpbCBvbiBwYWxqdSB0YXVzdGF0ZWFkbWlzaSwgc2lpcyBvbiBzZWUgamFvdHVzIGvDtXJnZSBqYSBraXRzYXMsIGt1aSBtZWlsIG9uIHbDpGhlIHRhdXN0YXRlYWRtaXNpLCBzaWlzIG9uIHNlZSBtYWRhbCBqYSBsYWkuIElnYWwganVodWwgasOkcmdtaXNlIHNhbW11bmEga29ycnV0YWIgYmF5ZXNpYWFuIG5lZWQga2FrcyBqYW90dXN0IHNhYWRlcyB0dWxlbXVzZWtzIGtvbG1hbmRhIG5vcm1hYWxqYW90dXNlLCBtaWxsZSB0YSBzZWVqw6RyZWwgbm9ybWFsaXNlZXJpYiBuaWksIGV0IGphb3R1c2UgYWx1bmUgcGluZGFsYSA9IDEuIAoKU2VlIGtvbG1hcyBqYW90dXMgb24gcG9zdGVyaW9vcm5lIHTDtWVuw6Rvc3VzLCBtaXMgc2lzYWxkYWIga29ndSBpbmZvdCwgbWlsbGVzdCBhcnZ1dGFkYSBrw7VpZ2UgdMO1ZW7DpG9saXNlbSBrYXRzZWVmZWt0aSBzdXVydXMga29vcyBlYmFraW5kbHVzZSBtw6TDpHJhZ2Egc2VsbGUgw7xtYmVyIChtaWRhIHJvaGtlbSBhbmRtZWlkLCBzZWRhIHbDpGlrc2VtIGViYWtpbmRsdXMpIGphIHTDtWVuw6Rvc3VzZWQsIGV0IHRlZ2VsaWsga2F0c2VlZmVrdCBqw6TDpGIgw7xrc2vDtWlrIG1pbGxsaXNlc3NlIG1laWQgaHV2aXRhdmFzc2UgdmFoZW1pa2t1LgoKIyMjI1NhZ2VkdXNsaWsgc3RhdGlzdGlrIApTYWdlZHVzbGlrIGzDpGhlbmVtaW5lIHNlZXZhc3R1IHNpc2FsZGFiIGFpbnVsdCDDvGh0ZSBtdWRlbGl0LCBtaWRhIHbDtXJyZWxkYWtzZSB2YWxpbWkgYW5kbWV0ZWdhLiBTYWdlZHVzbGlrIHN0YXRpc3RpayBhbHVzdGFiIHTDpHBzZWx0IHNhbWEgbW9vZGkgbmFndSBiYXllc2lhYW4sIHRla2l0YWRlcyBlZWxtaXNlZ2EgaWRlbnRzZSBhbm1kZW11ZGVsaSwgbWlzIG9uIGtlc2tlbmRhdHVkIHZhbGltaSBrZXNrdsOkw6RydHVzZWxlIGphIG9tYWIgc2FtYSBsYWl1c3QgKFNFTSkuIFNlZWrDpHJlbCBuaWh1dGFiIHRhIG9tYSBhbmRtZW11ZGVsaXQgbmlpcGFsanUsIGV0IG5vcm1hYWxqYW90dXNlIHRpcHAgZWkgb2xlIGVuYW0gdmFsaW1pIGtlc2t2w6TDpHJ0dXNlIGtvaGFsIHZhaWQgaG9vcGlzIDAtdsOkw6RydHVzZSBrb2hhbCAobsOkaXRla3MgMC1lZmZla3RpIGtvaGFsKS4gU2FtYXMsIGphb3R1c2UgbGFpdXMgZWkgbXV1dHUuIFNlZGEgbnVsbGlsZSB0c2VudHJlZXJpdHVkIG11ZGVsaXQga3V0c3V0YWtzZSBudWxsLWjDvHBvdGVlc2lrcyAoSDApLiBKw6RyZ21pbmUgc2FtbSBlcmluZWIgc2FtdXRpIGJheWVzaWFhbmkgb21hc3QuIE7DvMO8ZCB2w7VycmVsZGFrc2Ugb21hIHZhbGltaSBrZXNrdsOkw6RydHVzdCBIMCBqYW90dXNlZ2EuIEt1aSB2YWxpbWkga2Vza3bDpMOkcnR1c2Uga29oYWwgb24gSDAgamFvdHVzIGvDtXJnZSwgc2lpcyBvbiBhbmRtZXRlIHTDtWVuw6Rvc3VzIEgwIGtlaHRpbWlzZSBrb3JyYWwgc3V1ci4gSmEga3VpIHZhbGltaSBrZXNrdsOkw6RydHVzZSBrb2hhbCBvbiBIMCBub3JtYWFsamFvdHVzIG1hZGFsLCBzaWlzIG9uIGFuZG1ldGUgZXNpbmVtaXNlIHTDtWVuw6Rvc3VzIEgwIGFsbCBtYWRhbC4gU2VkYSB0w7VlbsOkb3N1c3Qga3V0c3V0YWtzZSBwIHbDpMOkcnR1c2Vrcy4gTWlkYSB2w6Rpa3NlbSBvbiBwIHbDpMOkcnR1cywgc2VkYSB2w6RoZW0gdMO1ZW7DpG9saXNlZCBvbiB0ZWllIGFuZG1lZCBqdWh1bCwga3VpIEgwIG9uIHTDtWVuZSBqYSBrYXRzZWVmZWt0IHbDtXJkdWIgbnVsbGlnYS4gVGVobmlsaXNlbHQgb24gcCBkZWZpbmVlcml0dWQga3VpICJ0ZWllIGFuZG1ldGUgdsO1aSAwLXN0IHZlZWwga2F1Z2VtYWwgYXN1dmF0ZSBhbmRtZXRlIGVzaW5lbWlzZSBwaWthYWphbGluZSBzdWh0ZWxpbmUgc2FnZWR1cyB0aW5naW11c2VsLCBldCBIMCBrZWh0aWIiLgoKIyMjI3R1bGVtdXN0ZSB0w7VsZ2VuZGFtaW5lCkt1aSBzYWdlZHVzbGlrIHN0YXRpc3RpayBraXJqdXRhYiBvbWEgYXJ0aWtsaXRlcywgZXQgdGVtYSAiZWZla3RpIHN1dXJ1cyBvbiBzdGF0aXN0aWxpc2VsdCBvbHVsaW5lIDAuMDUgb2x1bGlzdXNuaXZvb2wiIHNpaXMgdGEgw7x0bGViIHNlbGxlZ2EsIGV0IHRlbWEgcG9vbHQgYXJ2dXRhdHVkIHAgPCAwLjA1LiBTZWxsZSBrb3JyZWt0bmUgdMO1bGdlbmR1cyBvbiwgZXQganVodWwga3VpIHN0YXRpc3RpayBwaWthIGFqYSBqb29rc3VsIHbDtXRhYiBvbWFrcyAic3RhdGlzdGlsaXNlbHQgb2x1bGlzdGVuYSIga8O1aWsgdHVsZW11c2VkLCBtaWxsZWdhIGthYXNuZXYgcCAgPCAwLjA1IGphIGzDvGtrYWIgdGFnYXNpIGvDtWlrIHR1bGVtdXNlZCwgbWlsbGUgcCA+IDAuMDUsIHNpaXMgc29vcml0YWIgdGEgNSUgc2FnZWR1c2VnYSB0w7zDvHAgMSB2aWd1LiBTZWUgdMOkaGVuZGFiLCBldCBpZ2FzdCBzYWphc3QgdMO1ZXNlc3QgSDAtc3QsIG1pZGEgdGEgdGVzdGliLCB2w7V0YWIgdGEga2Vza2VsdGzDpGJpIDUgdmFzdHUga3VpIHN0YXRpc3RpbGlzZWx0IG9sdWxpc2VkLiBTZWxsaXNlbCBrdWp1bCB0w7bDtnRhYiBzYWdlZHVzbGlrIHN0YXRpc3Rpa2EgdsOkZ2EgaMOkc3RpIC0tLSBzZWUgb24gcGFyaW0gdmlpcyB0w7zDvHAgMSB2aWdhZGUgc2FnZWR1c2UgcGlrYWFqYWxpc2VrcyBmaWtzZWVyaW1pc2Vrcy4gQWdhIGt1bmEgbWUgZWkgdGVhIMO8aGVnaSDDvGtzaWt1IHRlc3RpIGtvaHRhIGV0dGUsIGthcyBzZWUgdGVzdGliIGtlaHRpdmF0IHbDtWkgbWl0dGVrZWh0aXZhdCBIMC1pLCBzaWlzIG9uIHNlbGxlIGthc3V0ZWd1ciBrYXRzZXNlZXJpYXRlIMO8aGVrYXVwYSB0w7VsZ2VuZGFtaXNlbCB2YWllbGRhdi4gVHVsZXRhbWUgbWVlbGRlLCBldCBzYWdlZHVzbGlrdXMgc3RhdGlzdGlrYXMgZWkgc2FhIHLDpMOka2lkYSBIMCBrZWh0aW1pc2UgdMO1ZW7DpG9zdXNlc3QgdmFpZCBwZWFiIHLDpMOka2ltYSBhbmRtZXRlIHTDtWVuw6Rvc3VzZXN0ICg9IGFuZG1ldGUgZXNpbmVtaXNlIHNhZ2VkdXNlc3QpIHRpbmdpbXVzZWwsIGV0IEgwIGtlaHRpYi4gCgpLYXMgcCB2w6TDpHJ0dXNpIHNhYWIgdMO1bGdlbmRhZGEgw7xoZWthdXBhIGt1aSBoaW5uYW5ndXQgdMO1ZW5kdXNtYXRlcmphbGkgaHVsZ2FsZSwgbWlkYSB0ZWllIHZhbGltIHBha3ViIEgwIHZhc3R1PyBTZWxsZSDDvGxlIG9uIHZhaWVsZHVkIMO8bGUgODAgYWFzdGEsIGt1aWQgdHVuZHViLCBldCBhaW51cyB2aWlzIHNlZGEga2FzIHbDtWkgdW1ia2F1ZHUgdGVoYSBvbiBiYXllc2lhYW5saWsuIEt1aSB0ZSBtw7V0bGV0ZSBwIHbDpMOkcnR1c2UgZGVmaW5pdHNpb29uaWxlLCBzaWlzIHBlYWtzaXRlIG3DtWlzdG1hLCBtaWtzIHAgdsOkw6RydHVzdCwgbWlzIG9uIGRlZmluZWVyaXR1ZCBwaWthYWphbGlzZSBzYWdlZHVzZW5hLCBvbiByYXNrZSByYWtlbmRhZGEgw7xrc2lrc8O8bmRtdXN0ZWxlLiBCYXllc2lhYW5saWt1IHAgdsOkw6RydHVzdGUgdMO1bGdlbmRhbWlza2Fsa3VsYWF0b3JpIGxlaWF0ZSBhYWRyZXNzaWx0IC4uLiAgCgp0w7zDvHBpbGluZSB0dWxlbXVzZSBraXJqZWxkdXMgYXJ0aWtsaXM6IAoKMS4gc2FnZWR1c2xpazogdGhlIGVmZmVjdCBzaXplIGlzIHEgKHAgPCAwLjAxKS4KCjIuIGJheWVzaWFhbmxpazogdGhlIG1vc3QgbGlrZWx5IGVmZmVjdCBzaXplIGlzIHExICg5MCUgQ0k9IHEyLCBxMykgYW5kIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSB0cnVlIGVmZmVjdCBpcyBsZXNzIHRoYW4gemVybyBpcyBxNCBwZXJjZW50LiBbOTAlIENJIC0gY3JlZGlibGUgaW50ZXJ2YWw7IHTDpGhlbmRhYiwgZXQgbWUgb2xlbWUgOTAlIGtpbmRsYWQsIGV0IHRlZ2VsaWsgZWZla3RpIHN1dXJ1cyBhc3ViIHZhaGVtaWt1cyBxMiAuLi4gcTNdIAoKIyMjI2thaGUgcGFyYWRpZ21hIGVyaW5ldnVzZWQgCgoxLiBzYWdlZHVzbGlrdXMgc3RhdGlzdGlrYXMgdsO1cmR1YiBwYXJpbSBoaW5uYW5nIHRlZ2VsaWt1bGUgZWZla3RpIHN1dXJ1c2VsZSB2YWxpbWkga2Vza21pc2UgZWZla3RpIHN1dXJ1c2VnYS4gQmF5ZXNpIHN0YXRpc3Rpa2FzIHNlZSBzYWdlbGkgbmlpIGVpIG9sZSBzZXN0IHRhdXN0YXRlYWRtaXN0ZSBtdWRlbCBtw7VqdXRhYiBzZWRhIGhpbm5hbmd1dC4gUGFsanVkIG11ZGVsaWQgcMO8w7xhdmFkIGVrc3RyZWVtc2VpZCB2YWxpbWVpZCB0YXVzdGF0ZWFkbWlzdGUgYWJpbCBtw7Vpc3RsaWt1cyBzdXVuYXMgdmVpZGkgbmlodXRhZGEsIG5paXZpaXNpIHbDpGhlbmRhZGVzIMO8bGVwYWlzdXRhdHVkIGVmZWt0aWRlIGF2YWxkYW1pc2Ugb2h0dS4KCjIuIHNhZ2VkdXNsaWsgc3RhdGlzdGlrYSB0w7bDtnRhYiB0w6RudSBzZWxsZWxlLCBldCB1dXJpamEgdsO1dGFiIHZhc3R1IHBsdXNzLW1paW51cyBvdHN1c2VpZDogaWdhIEgwIGthcyBsw7xrYXRha3NlIMO8bWJlciB2w7VpIGrDpGV0YWtzZSBrZWh0aW1hLiBTZWV2YXN0dSBiYXllc2lhYW4gbcO1dGxlYiBoYWxsaSB2YXJqdW5kaXRlczogc2lzc2V0dWxldmFkIGFuZG1lZCBrYXMgc3V1cmVuZGF2YWQgdsO1aSB2w6RoZW5kYXZhZCBow7xwb3RlZXNpZGUgdMO1ZW7DpG9zdXNpIChtaXMgasOkw6R2YWQgYWdhIGFsYXRpID4gMCBqYSA8IDEpLgoKMy4gcCB2w6TDpHJ0dXNlZCBrb250cm9sbGl2YWQgdMO8w7xwIDEgdmlnYWRlIHNhZ2VkdXN0IGFpbnVsdCBzaWlzLCBrdWkga2F0c2UgZGlzYWluaSBqYSBoaWxpc2VtYSB0dWxlbXVzdGUgYW5hbMO8w7xzaSBkZXRhaWxpZCBvbiBlbm5lIGthdHNlIHNvb3JpdGFtaXN0IGrDpGlnYWx0IGZpa3NlZXJpdHVkICh2w7VpIGVlbG5ldmFsdCBvbiB0w6Rwc2VsdCBwYWlrYSBwYW5kdWQgbHViYXR1ZCB2YXJpYXRzaW9vbmlkIGthdHNlLSBqYSBhbmFsw7zDvHNpIHByb3Rva29sbGlzKS4gRWVsa8O1aWdlIHTDpGhlbmRhYiBzZWUsIGV0IHZhbGltaSBzdXVydXMgamEga2FzdXRhdGF2KGFkKSBzdGF0aXN0aWxpbmUoc2VkKSB0ZXN0KGlkKSBwZWF2YWQgb2xlbWEgZWVsbmV2YWx0IGZpa3NlZXJpdHVkLiBNZSBzYWFtZSBwIHbDpMOkcnR1c2UgYXJ2dXRhZGEgdmFpZCDDvGtzIGtvcmQgamEga3VpIHAgPSAwLjA1MSwgc2lpcyBvbGVtZSBzdW5uaXR1ZCBIMCBwYWlrYSBqw6R0bWEgbmluZyBlZmVrdGkgZGVrbGFyZWVyaW1pc2VzdCBsb29idW1hLiBNZSBlaSBzYWEgbGlodHNhbHQga2F0c2V0IGp1dXJkZSB0ZWhhLCBldCB2YWFkYXRhLCBtaXMganVodHViLiBCYXllc2lhYW4gc2VldmFzdHUgdsO1aWIgb21hIHBvc3Rlcmlvb3JzZSB0w7VlbsOkb3N1c2UgYXJ2dXRhZGEga2FzdsO1aSBww6RyYXN0IGlnYSBrYXRzZXB1bmt0aSBrb2d1bWlzdCBuaW5nIGthdHNlIHBlYXRhZGEga29oZSAodsO1aSBhbGxlcyBzaWlzKSwga3VpIHRhIGxlaWFiLCBldCB0ZW1hIHBvc3Rlcmlvb3JuZSBqYW90dXMgb24gcGlpc2F2YWx0IGtpdHNhcywgZXQgdGVhZHVzbGlra3UgaHV2aSBwYWtrdWRhLgoKNC4gc2FnZWR1c2xpa3Ugc3RhdGlzdGlrYSBwbHVzcy1taWludXMgaXNlbG9vbSB0aW5naWIgc2VsbGUsIGV0IGt1aSB0ZWdlbGlrIGVmZWt0aSBzdXVydXMgb24ga8O8bGwgdGVhZHVzbGlrdWx0IGh1dml0YXYsIGFnYSBzaWlza2kgbGlpZ2EgdsOkaWtlLCBldCB0ZWllIGthdHNlc2lzZXNlIHZhcmllZXJ1dnVzZSBqYSB2YWxpbWkgc3V1cnVzZSBqdXVyZXMgYW5kYSBwIDwgMC4wNSwgc2lpcyBhbm5hdmFkIHN0YXRpc3RpbGlzZWx0IG9sdWxpc2kgdHVsZW11c2kgYWludWx0IHBvcHVsYXRzaW9vbmlnYSB2w7VycmVsZGVzIMO8bGVwYWlzdXRhdHVkIGVmZWt0aSBzdXVydXNlZ2EgamEgYWxhbmRhdHVkIHZhcmllZXJ1dnVzZWdhIHZhbGltaWQuIChTZWxsaXNlaWQgdmFsaW1laWQgdGVraWIgdMOkbnUganVodXNsaWtlbGUgdmFsaW1pZWZla3RpZGVsZS4pIE5paSBzYWFiIHPDvHN0ZW1hYXRpbGlzZWx0IGthbGx1dGF0dWQgdGVhZHVzZSwgbWlzIGhpbmRhYiBrb3JkYWRlcyDDvGxlIG9tYSBlZmVrdGlkZSBzdXVydXNpLiBCYXllc2kgc3RhdGlzdGlrYXMgc2VkYSBwcm9ibGVlbWkgZWkgZXNpbmUsIGt1bmEgb3RzdXNlZCBlaSBvbGUgcGx1c3MtbWlpbnVzIHTDvMO8cGkuCgo1LiBiYXllc2kgc3RhdGlzdGlrYSBlaSBob2lhIHTDvMO8cCAxIHZpZ2FkZSBzYWdlZHVzdCBrb250cm9sbGkgYWxsLiBTZWUtZWVzdCB2w7V0bGViIHNlZSBubiB2YWxlaMOkaXJldGUgdmFzdHUsIG1pbGxla3Mga2Fhc2FqYWwga2FzdXRhdGFrc2UgZW5pbSBoaWVyYXJoaWxpc2kgc2hyaW5rYWdlIG11ZGVsZWlkLiBOZWlkIGvDpHNpdGxlbWUgb21hIMO1cGlrdXMgcMOkcmlzIGzDtXB1cy4gU2VlIG9uIGthIGJheWVzaSB2YXN0ZSBzYWdlZHVzbGlrdXMgc3RhdGlzdGlrYXMga2FzdXRhdGF2YXRlbGUgbXVsdGlwbGUgdGVzdGluZ3Ugc3VodGVzIGFkanVzdGVlcml0dWQgcCB2w6TDpHJ0dXN0ZWxlLgoKClNlZSBvbiBrw7VpaywgbWlkYSBtZSBzYWdlZHVzbGlrdSBzdGF0aXN0aWthIGtvaHRhIMO8dGxlbWUuIE1pdHRlIG1pc2tpLCBtaXMgasOkcmduZWIsIGVpIGVlbGRhIHNhZ2VkdXNsaWt1IHBhcmFkaWdtYSB0dW5kbWlzdCBlZ2EgdmFsZGFtaXN0LgoKCiMxLiBvc2E6IE11ZGVsIGphIG1hYWlsbQoKQW5kbWVhbmFsw7zDvHMgamEgc3RhdGlzdGlrYSAoc2lpbiBzw7xub27DvMO8bWlkKSBvbiBsYWh1dGFtYXR1IG9zYSBpZ2FzdCBsb29kdXN0ZWFkdXNlc3QuIErDpHJnbmV2YWx0IHNlbGV0YW4sIG1pa3MuCgojIyMgU3V1ciBqYSB2w6Rpa2UgbWFhaWxtCgpLdW5hIG1hYWlsbSBvbiBsaWlnYSBzdXVyIGphIGtlZXJ1bGluZSwgZXQgc2VkYSBvdHNlIHV1cmlkYSwgbMO1aWthdmFkIHRlYWRsYXNlZCBzZWxsZSB2w6Rpa3NlbWF0ZWtzIHTDvGtraWRla3MsIGthc3V0YWRlcyB0b3JkaWxhYmlkYW5hIHRlYWR1c2xpa2UgaMO8cG90ZWVzZS4gVMO8w7xwaWxpbmUgaMO8cG90ZWVzIHBha3ViIHbDpGxqYSBtaXR0ZW1hdGVtYWF0aWxpc2Ugc2VsZXR1c2UgbcO1bmVsZSBraXRzYWx0IHBpaXJpdGxldHVkIGxvb2R1c27DpGh0dXNlbGUuIE7DpGl0ZWtzIGRhcnZpbmlzdGxpayBldm9sdXRzaW9vbml0ZW9vcmlhIHDDvMO8YWIgc2VsZXRhZGEgZXZvbHV0c2lvb25pIHRvaW1lbWVoaGFuaXNtZS4gU2VkYSB0ZW9vcmlhdCB2w7VpYiB2w7VycmVsZGEgZW1waWlyaWxpc3RlIGFuZG1ldGVnYS4gCgpNaXMganVodHViLCBrdWkgdGVpZSBsZW1taWtow7xwb3RlZXMgb24gYW5kbWV0ZWdhIGtvb3Nrw7VsYXM/IEthcyBzZWUgdMOkaGVuZGFiLCBldCBzZWUgaMO8cG90ZWVzIG9uIHTDtWVuZT8gVsO1aSwgZXQgc2VlIG9uIHTDtWVuw6RvbGlzZWx0IHTDtWVuZT8gS2FoanVrcyBvbiB2YXN0dXMgbcO1bGVtYWxlIGvDvHNpbXVzZWxlIGVpdGF2LiBQw7VoanVzZWtzIG9uIGFzamFvbHUsIGV0IGVuYW1hc3RpIGxlaWFiIGlnYSBuw6RodHVzZSBzZWxldGFtaXNla3Mgcm9oa2VtIGt1aSDDvGhlIGFsdGVybmF0aWl2c2UgdGVhZHVzbGlrdSBow7xwb3RlZXNpIChuw6RpdC4gbGFtYXJrc2lzdGxpayBldm9sdXRzaW9vbml0ZW9vcmlhKSBuaW5nIHJvaGtlbSBrdWkgw7xrcyDDvGtzdGVpc3QgdsOkbGlzdGF2IGjDvHBvdGVlcyB2w7VpYiBvbGxhIG9sZW1hc29sZXZhdGUgYW5kbWV0ZWdhIHbDtXJkc2VzIGtvb3Nrw7VsYXMuIEFzamEgdGVlYiB2ZWVsIGh1bGxlbWFrcywgZXQgdGVvcmVldGlsaXNlbHQgb24gdsO1aW1hbGlrIHPDtW5hc3RhZGEgbMO1cG1hdHVsdCBwYWxqdSBlcmluZXZhaWQgdGVvb3JpYWlkLCBtaXMga8O1aWsgcGFrdXZhZCBhbHRlcm5hdGlpdnNlaWQgamEgw7xrc3RlaXN0IHbDpGxpc3RhdmFpZCBzZWxldHVzaSBzYW1hbGUgbsOkaHR1c2VsZS4gCgpPbGd1IHBlYWxlLCBrdWkgbWUgdmFhdGFtZSBtYWFpbG1hIGvDtWlrZXRlYWRqYSBqdW1hbGEgcGVyc3Bla3RpaXZpc3QsIHNpaXMgdGVtYSB2w7VpYiB2YWFkZWxkYSBrw7Vpa2Vow7VsbWF2YSB0w7VlbmR1c21hdGVyamFsaSBzb2JpdnVzdCBrw7VpZ2kgdsO1aW1hbGlrZSB0ZW9vcmlhdGVnYSBuaW5nIHZhbGlkYSB2w6RsamEgc2VsbGUgYWluc2EgdGVvb3JpYSwgbWlzIGvDtWlnZSBwYXJlbWluaSB0w7VlbmR1c21hdGVyamFsaWdhIHNvYmliLiBLdWlnaSwgc2VlIGVlbGRha3MsIGV0IGp1bWFsYWwgb24gbMO1cG1hdGEgcGFsanUgYW5kbWVpZCwgc2VzdCBtdWlkdSBlaSBvbGVrcyB0YWwgbG9vZ2lsaXNlbHQgdsO1aW1hbGlrIGzDtXBtYXRhIHBhbGp1ZGUgdGVvb3JpYXRlIHZhaGVsIHZhbGlkYSAtIGFnYSBqdW1hbGEgamFva3Mgb24ga8O1aWsgdsO1aW1hbGlrLiBJZ2FsIGp1aHVsIG1laWUsIHN1cmVsaWtlLCBqYW9rcyB0w6RoZW5kYWIgc2VlLCBldCB0ZWFkdXNsaWt1cyAiZmFrdGlzIiBzYWFiIGFsYXRpIGthaGVsZGEgc2VzdCBrdW5hZ2kgZWkgdsO1aSBraW5kZWwgb2xsYSwgZXQgcGFyaW1hZCB0ZW9vcmlhZCBsw7VwbWF0YSBzdXVyZXN0IHRlb29yaWFwaWx2ZXN0IGVpIG9sZSBtZWlsIHTDpGllc3RpIHTDpGhlbGVwYW51dGEgasOkw6RudWQgbmluZywgZXQgbWVpZSBqYW9rcyBla3Npc3RlZXJpdmFkIGFuZG1lZCBrYWphc3Rha3NpZCBow6RzdGkga8O1aWtpIHbDtWltYWxpa2tlIGFuZG1laWQhIE9uIHNlbGdlIG5hZ3Ugc2VlYml2ZXNpLCBldCBtaWRhIHbDpGhlbSBhZWdhIG1lIGt1bHV0YW1lIHRlb29yaWFsb29tZWtzIGphIGFuZG1ldGUga29ndW1pc2Vrcywgc2VkYSB2w6RoZW0gdXN1dGF2YWQgb24ga2EgbWVpZSB0ZWFkdXNsaWt1ZCBqw6RyZWxkdXNlZC4gRW5hbWFzdGkgb24gbmlpLCBldCBtaWRhIGtlaHZlbSBvbiBvbHVrb3JkIGFuZG1lcmluZGVsLCBzZWRhIHJvaGtlbSB2YWphbWUgc3RhdGlzdGlrYXQuIEt1aSBtZWlsIMO1bm5lc3R1a3Mgb21hIGFuZG1ldGVzdCBpbG1hIHN0YXRpc3Rpa2F0YSBzYWlhIHRlaGEsIGVpIGvDtWhrbGVrcyBtZSBoZXRrZWdpISBFcml0aSwga3VuYSBzdGF0aXN0aWthZ2Ega8OkaXZhZCBrw6RzaWvDpGVzIHN0YXRpc3RpbGlzZWQgbXVkZWxpZC4gICAgICAgICAKCiMjIyBNdWRlbGkgdsOkaWtlIG1hYWlsbQoKICDDnGxhbG1haW5pdHVkIHRlYWR1c2xpa3UgbWVldG9kaSBwdXVkdXNlZCB0aW5naXZhZCwgZXQgbWVpZSBodXZpZGVzIG9uIG9tYSB0ZWFkdXNsaWtrZSBwcm9ibGVlbWUgdmVlbCDDvGhlIHRhc2VtZSB2w7VycmEgbGlodHN1c3RhZGEsIHRhYW5kYWRlcyBuZWVkIHN0YXRpc3RpbGlzdGVrcyBwcm9ibGVlbWlkZWtzLiBTZWxsZWtzIHR1bGV0YW1lIG1lIHRhdmFrZWVsc2VzdCBqYSBsYWlhaGFhcmRlbGlzZXN0IHRlYWR1c2xpa3VzdCB0ZW9vcmlhc3QgdMOkcHNlbHQgZm9ybXVsZWVyaXR1ZCBtYXRlbWFhdGlsaXNlIG11ZGVsaSBuaW5nIHNlZWrDpHJlbCBhc3VtZSB1dXJpbWEgb21hIG11ZGVsaXQuIAogIAogIE11ZGVsaSBtYWFpbG0gZXJpbmViIHDDpHJpcyBtYWFpbG1hc3Qgc2VsbGUgcG9vbGVzdCwgZXQgbXVkZWxpIG1hYWlsbWFzIG9uIGvDtWlrdsO1aW1hbGlrdWQgc8O8bmRtdXNlZCwgbWlzIHDDtWhpbcO1dHRlbGlzZWx0IHbDtWl2YWQganVodHVkYSwganViYSBldHRlIHRlYWRhIGphIMO8bGVzIGxvZXR1ZCAoc2VkYSBzw7xuZG11c3RlIGtvZ3Uga3V0c3V0YWtzZSBwYXJhbWVldHJpcnV1bWlrcykuIFNlZWdhLCB0ZWhuaWxpc2VsdCBvbiBtdWRlbGkgbWFhaWxtYXMgw7xsbGF0dXNlZCB2w7VpbWF0dWQuCiAgCiAgTXVkZWxpIGVlbGlzZWtzIHRlb29yaWEgZWVzIG9uLCBldCBow6RzdGkga29uc3RydWVlcml0dWQgbXVkZWwgb24gbGlodHNhbWluaSBtw7Vpc3RldGF2IC0tLSBlcmluZXZhbHQgdsOkaGVnaSBrZWVydWxpc2VtYXN0IHRlYWR1c2xpa3VzdCBow7xwb3RlZXNpc3Qgb24gbXVkZWxpIGVlbGR1c2VkIGphIGVubnVzdHVzZWQgbMOkYmluw6RodGF2YWQgamEgdMOkcHNlbHQgZm9ybXVsZWVyaXRhdmFkLiBNdWRlbGkgcHV1ZHVzZWtzIG9uIGFnYSwgZXQgZXJpbmV2YWx0IHRlb29yaWFzdCBlaSBvbGUgbWluZ2l0IHbDtWltYWx1c3QsIGV0IG11ZGVsIHZhc3Rha3MgdGVnZWxpa2t1c2VsZSBlaGsgb2xla3MgdMO1ZW5lLiBTZWRhIHNlbGxlcMOkcmFzdCwgZXQgbXVkZWwgb24gdGFvdGx1c2xpa3VsdCBsaWh0c3VzdGF2IChlcmFuZGlrcyBvbiBwdWh0YWx0IGVubnVzdHVzbGlrdWQgbXVkZWxpZCwgbWlzIG9uIGFnYSBlbmFtYXN0aSBsw6RiaW7DpGh0YW1hdHUgc3RydWt0dXVyaWdhKS4gTXVkZWwgb24ga2FzIGthc3VsaWsgdsO1aSBrYXN1dHU7IHRlb29yaWEgb24ga2FzIHTDtWVuZSB2w7VpIHbDpMOkci4gTXVkZWxpIGphIG1hYWlsbWEgdmFoZWwgdsO1aWIgb2xsYSBrYXVkbmUgInBlZWdlbGR1cyIsIGFnYSBtaXR0ZSBrdW5hZ2kgb3RzZW5lIHNpZGUuIFNlZWdhLCDDvGtza2kgbnVtYmVyLCBtaXMgYXJ2dXRhdGFrc2UgbXVkZWxpIHJhYW1lcywgZWkga2FuZHUgc2FtYSBudW1icmluYSDDvGxlIHRlYWR1c2xpa2t1IGVnYSBww6RyaXMgbWFhaWxtYS4gSmEga29ndSBzdGF0aXN0aWthIChrYSBtaXR0ZXBhcmFtZWV0cmlsaW5lKSB0b2ltdWIgbXVkZWxpIHbDpGlrc2VzIG1hYWlsbWFzLiBBcnZ1ZCwgbWlkYSBzdGF0aXN0aWthIHRlaWxlIHBha3ViLCBlbGF2YWQgbXVkZWxpIG1hYWlsbWFzOyBzYW1hcyBrdWkgdGVpZSB0ZWFkdXNsaWsgaHV2aSBvbiBzdXVuYXR1ZCBww6RyaXMgbWFhaWxtYWxlLiBOw6RpdGVrcyA5NSUgdXNhbGR1c2ludGVydmFsbCBlaSB0w6RoZW5kYSwgZXQgdGUgcGVha3NpdGUgb2xlbWEgOTUlIGtpbmRlbCwgZXQgdMO1ZGUgYXN1YiBzZWxsZXMgaW50ZXJ2YWxsaXMg4oCTIHNhZ2VsaSBlaSB0b2hpa3MgdGUgc2VkYSBuaWkganVsZ2VsdCB0w7VsZ2VuZGFkYSBpc2VnaSBraXRzYXMgbXVkZWxpIG1hYWlsbWFzLiAKICAKIyMjIyBOw6RpZGU6IEFyaXN0b3RlbGVzLCBQdG9sZW1haW9zIGphIEtvcGVybmlrdXMKCkFyaXN0b3RlbGVzIGzDtWkgdGVvb3JpYSBtYWFpbG1hIHRvaW1pbWlzZSBrb2h0YSwgbWlzIGRvbWluZWVyaXMgaGFyaXR1ZCBFdXJvb3BsYXNlIG1hYWlsbWFwaWx0aSBlbmFtIGt1aSAxMjAwIGFhc3RhIHbDpGx0ZWwuIFNlbGxlIGtvaGFzZWx0IGFzdWIgdW5pdmVyc3VtaSBrZXNrcHVua3RpcyBtYWFrZXJhIG5pbmcga8O1aWssIG1pZGEgc2lpbiBsZWlkYSB2w7VpYiwgb24gdGVodHVkIG5lbGphc3QgZWxlbWVuZGlzdDogbWFhLCB2ZXNpLCDDtWhrIGphIHR1bGkuIFNhbWFzLCBrb2d1IG1hYWlsbWFydXVtIGFsYXRlcyBrdXUgc2bDpMOkcmlzdCBvbiB0ZWh0dWQgdmlpZW5kYXN0IGVsZW1lbmRpc3QgKGVldGVyKSwgbWlkYSBhZ2EgZWkgbGVpZHUgbWFhbCAobmFndSBuZWxqYSBlbGVtZW50aSBlaSBsZWlkdSBrdXUgcGVhbCBqYSBzZWFsdCBlZGFzaSkuIFRhZXZha2VoYWQgKGt1dSwgcMOkaWtlLCBwbGFuZWVkaWQgamEga2lubmlzdMOkaGVkKSB0aWlybGV2YWQgw7xtYmVyIG1hYSBrb250c2VudHJpbGlzdGVzIHNmw6TDpHJpZGVzLCBtaXMgb24gb21hdmFoZWwgc2VvdHVkIChtaWxsZSB2YWhlbCBwb2xlIHZhYmEgcnV1bWkpLiBTZWVnYSBvbiBrb2d1IGxpaWt1bWluZSBlZXRyaSBzZsOkw6RyaWRlcyDDvGh0bGFuZSBqYSByaW5naWt1anVsaW5lIGphIHNlZSBsaWlrdW1pbmUgcMO1aGp1c3RhYiBwaWthIHDDtWhqdXMtdGFnYWrDpHJnIGFoZWxhIGthdWR1IGvDtWlraSBsaWlrdW1pc2ksIG1pZGEgbWFhcGVhbCBrb2h0YW1lLiBLYWFzYSBhcnZhdHVkIG1laWUgc8O8bmRpbWluZSwgZWx1a8OkaWsgamEgc3VybSAobWlzIG9uIGvDtWlrIGxpaWt1bWlzZWQpLiBLw7VpaywgbWlzIG1hYXBlYWwgaHV2aXRhdmF0LCBlaGsga29ndSBsaWlrdW1pbmUsIG9uIGFsZ3NlbHQgcMO1aGp1c3RhdHVkIGVzaW1lc2UgbGlpa3VtaXNlIHBvb2x0LCBtaWxsZSBrw6Rpdml0YWIga8O1aWdlIHbDpGxpbWlzZXMgc2bDpMOkcmlzIHBhaWtuZXYgbWVpZSBqYW9rcyBtw7Vpc3RldGFtYXR1IGludGVsbGVrdGlnYSAib2xlbmQiLiAgCgpBcmlzdG90ZWxlc2Ugc3V1ciB0ZW9vcmlhIMO8aGVuZGFiIGtvZ3UgbWFhaWxtYXBpbGRpIGFsYXRlcyBrYWFzYWVnc2VzIG3DtWlzdGVzIGtlZW1pYXN0IGphIGtvc21vbG9vZ2lhc3Qga3VuaSBiaW9sb29naWEsIG1hYXRlYWR1c2UgamEgaXNlZ2kgZ2VvZ3JhYWZpYW5pLiBTZWxsaXNlZCDDvGhlbmR0ZW9vcmlhZCBvbiBuYWd1IHN1dXJlZCBzZWt2b2lhZDsgbmFkIG9uIHJhc2tlZCBsYW5nZXRhZGEsIGFnYSBrdWkgbcO1bmkgc2lpc2tpIGt1a3ViLCBrb3N0YWIgcmFnaW4ga2F1Z2VsZS4gU2FtYXMsIMO8aHRlIEFyaXN0b3RlbGVzZSBrb3Ntb2xvb2dpYSBvbHVsaXN0IHB1dWR1c3QgbsOkaHRpIGtvaGUuIE5pbWVsdCBlaSBzdXVkYSBBcmlzdG90ZWxlcyBzZWxldGFkYSwgbWlrcyBvc2FkIHBsYW5lZWRpZCB0ZWF2YXbDtWx2aWwgdmFoZXN0IHN1dW5kYSBtdXVkYXZhZCBqYSBtw7VuZGEgYWVnYSBsYXVzYSB2YXN0dXBpZGlzZXMgc3V1bmFzIGxpaWd1dmFkIChyZXRyb2dyZXNzaW9uKS4gS3VuYSBhc3Ryb25vb21pYSBww7VoaWxpbmUga2FzdXR1c2FsYSBvbGkgYXN0cm9sb29naWEsIHNpaXMgcMO1w7VyYXRpIHBsYW5lZXRpZGUgbGlpa3VtaXNlbGUgc3V1cnQgdMOkaGVsZXBhbnUuIExhaGVuZHVzZWtzIGVpIG9sbnVkIGFnYSBtaXR0ZSBzdXVyZSB0ZW9vcmlhIMO8bWJlcnRlZ2VtaW5lIHbDtWkgw7xtYmVybMO8a2thbWluZSwgdmFpZCBuw7V1ZGx1cyB1dWUgdGVhZHVzZSBqw6RyZWxlLCBtaXMgInDDpMOkc3Rha3MgZmVub21lbmlkIi4gU2lpbiB0dWxpIGFwcGkgUHRvbGVtYWlvcywga2VzIGzDtWkgbWF0ZW1hYXRpbGlzZSBtdWRlbGksIGt1cyBwbGFuZWVkaWQgbWl0dGUgbGlodHNhbHQgZWkgbGlpZ3UgcmluZ3RyYWpla3Rvb3JpIG3DtcO1ZGEgdmFpZCBzYW1hbCBhamFsIHRlZXZhZCBrYSB2w6Rpa3NlbWFpZCByaW5nZSDDvG1iZXIgZXNpbWVzZSBzdXVyZSByaW5nam9vbmUuIE5laWQgdsOkaWtzZW1haWQgcmluZ2Uga3V0c3V0YWtzZSBlcGl0c8O8a2xpdGVrcy4gU2VlIG11ZGVsIHN1dXRpcyBwbGFuZWV0aWRlIGxpaWt1bWlzdCB0YWV2YXbDtWx2aWwgcGlpc2F2YWx0IGjDpHN0aSBlbm51c3RhZGEsIGV0IGFzdHJvbG9vZ2lkZSBuw7V1ZGxpayBzZWx0c2tvbmQgc2VsbGVnYSByYWh1bGUgasOkaS4gCgpQdG9sZW1haW9zZWwgamEgdGVtYSBqw6RyZ2lqYXRlbCBvbGkgdGVnZWxpa3VsdCBtaXR1IGVyaW5ldmF0IG11ZGVsaXQuIE9zYWQgbmVpc3QgZWkgc2lhbGRhbnVkIGVwaXRzw7xrbGVpZCBqYSBtYWFrZXJhIGVpIGFzdW51ZCB0ZW1hIG11ZGVsaXRlcyB1bml2ZXJzdW1pIGtlc2tlbCwgdmFpZCBvbGkgc2VsbGVzdCBwdW5rdGlzdCBlZW1hbGUgbmlodXRhdHVkIC0tLSBuaWkgZXQgcMOkaWtlIGVpIHRlaW51ZCByaW5nZSDDvG1iZXIgbWFha2VyYSB2YWlkIMO8bWJlciB0w7xoamEgcHVua3RpLiBPbHVsaW5lIG9saSwgZXQgbGVpZHVzIGVwaXRzw7xrbGl0ZWdhIG11ZGVsIGphIGlsbWEgZXBpdHPDvGtsaXRldGEgbXVkZWwsIG1pcyBvbGlkIG1hdGVtYWF0aWxpc2VsdCBla3ZpdmFsZW50c2VkIGphIGFuZHNpZCBzZWVnYSB2w7VyZHNlaWQgZW5udXN0dXNpLiBPbGkgc2VsZ2UsIGV0IEFyaXN0b3RlbGVzZSB0ZW9vcmlhIGphIGZlbm9tZW5pZGUgcMOkw6RzdG1pc2UgbXVkZWxpZCBvbGlkIGZ1bmRhbWVudGFhbHNlbHQgZXJpbmV2YWQgYXNqYWQuIFNhbWFsIGFqYWwga3VpIEFyaXRvdGVsZXMgKipzZWxldGFzKiogbWFhaWxtYSBww7VoaW9sZW11c3QgcMO1aGp1c2xpa2Ugc2Vvc3RlIGphZGFuYSAobWl0dGUgbWF0ZW1hYXRpbGlzZWx0KSwgKipraXJqZWxkYXMvZW5udXN0YXMqKiBQdG9sZW1haW9zIHNlbGxlc2FtYSBtYWFpbG1hIGvDpGl0dW1pc3QgbWF0ZW1hYXRpbGlzdGUgKG1pdHRlIHDDtWhqdXNsaWtlKSBzdHJ1a3R1dXJpZGUgYWJpbC4KCk5paSB0ZWtraXMgb2x1a29yZCwga3VzIG1hYWlsbWEgbcO1aXN0bWlzZWtzIGthc3V0YXRpIDEwMDAgYWFzdGEgdsOkbHRlbCBBcmlzdG90ZWxlc2Ugw7xoZW5kdGVvb3JpYXQgYWdhIHNlbGxlIGtpcmplbGRhbWlzZWtzIGphIHR1bGV2aWt1IGVubnVzdGFtaXNla3MgaG9vcGlzIFB0b2xlbWFpbGlzaSBtdWRlbGVpZCwgbWlkYSBrZWVnaSBww6RyaXNlbHQgdMO1ZWtzIGVpIHBpZGFudWQgamEgbWlkYSBoaW5uYXRpIHNlbGxlIGrDpHJnaSwga3VpIGjDpHN0aSBuZWVkICJww6TDpHN0c2lkIGZlbm9tZW5lIi4gCgpTZWUgdG9vYiBtZWlkIEtvcGVybmlrdSBqdXVyZGUsIGtlcyB0ZWFkdXNhamFsb29sYXN0ZSBhcnZhdGVzIHZhbGxhbmRhcyAxNy4gc2FqYW5kaSB0ZWFkdXNsaWt1IHJldm9sdXRzaW9vbmkgYXZhbGRhZGVzIHJhYW1hdHUsIGt1cyB0YSBhc2V0YWIgcMOkaWtzZSB1bml2ZXJzdW1pIGtlc2tlbGUgamEgcGFuZWIgbWFhIHNlbGxlIMO8bWJlciByaW5ndHJhamVrdG9vcmlsIHRpaXJsZW1hLiBLYXMgS29wZXJuaWt1cyB0w7VyanVzIHNlbGxlZ2Ega8O1cnZhbGUgQXJpc3RvdGVsZXNlLCBQdG9sZW1haW9zZSB2w7VpIG3DtWxlbWFkPyBLYWFzYWVnbmUgc2Vpc3Vrb2h0IG9uLCBldCBrdWlnaSBLb3Blcm5pa3VzIHNvb3ZpcyB0ZWhhIGtvbG1hbmRhdCwgYXJ2YXNpZCB0ZW1hIHLDpG5nYWx0IG1hdGVtYWF0aWxpc2UgdGVvc2UgYXZhbGRhbWlzZWxlIGrDpHJnbmVudWQgNDAgYWFzdGEgdsOkbHRlbCBwZWEga8O1aWsgYXNqYXR1bmRsaWt1ZCBhc3Ryb25vb21pZCwgZXQgdGEgc29vdmlzIHbDpGxqYSBwYWtrdWRhIHZhaWQgbGlodHNhbWEgYWx0ZXJuYXRpaXZpIGVwaXRzw7xrbGl0ZWdhIG11ZGVsaWxlLCBtaXMgc2VsbGVrcyBhamFrcyBvbGkgbXV1dHVudWQgdsOkZ2Ega2VlcnVrYWtzIChhZ2Ega2Egc2FtYXbDtXJyYSBlbm51c3R1c3TDpHBzZWtzKS4gS3VuYSBLb3Blcm5pa3VzZSByYWFtYXQgbMOka3MgdHLDvGtraSBhamFsLCBtaWwgc2VsbGUgYXV0b3Igb2xpIGp1YmEgc3VyaXZvb2RpbCwga2lyanV0YXMgc2VsbGVsZSBlZXNzw7VuYSDDvGtzIHRlbWEgdmFpbXVsaWt1c3Qgc8O1YmVyLCBrZXMgcMO8w7xkaXMgb29kYXRhdmF0IGtpcmlrbGlra3UgcGFoYW1lZWxldG9ybWkgbGVldmVuZGFkYSB2w6RpdGVnYSwgZXQgcMOkaWtlc2Uga2Vza2VsZSB2aWltaW5lIGVpIG9sZSBtdXVkIGt1aSBtdWRlbGRhbWlzZSB0cmlraywgbWlsbGVzdCBlaSB0YXN1IGrDpHJlbGRhZGEsIGV0IG1hYWtlcmEga2EgdGVnZWxpa3VsdCDDvG1iZXIgcMOkaWtlc2UgdGlpcmxlYiAocGlpYmVsIG5pbWVsdCByw6TDpGdpYiBzZWxsZXN0LCBrdWlkYXMganVtYWwgcGVhdGFzIG3DtW5la3MgYWpha3MgdGFldmF2w7VsdmlsIHDDpGlrZXNlLCBtaXR0ZSBtYWEpLiBKYSBrdW5hIGVlc3PDtW5hIG9saSBhbm9uw7zDvG1uZSwgZWVsZGFzaWQgbHVnZWphZCBtdWlkdWdpLCBldCBzZWxsZSBraXJqdXRhcyBhdXRvci4gTGlzYWtzLCBrdWlnaSBLb3Blcm5pa3VzIHTDtXN0aXMgcMOkaWtlc2Uga2Vza2VsZSwgasOkaSB0YSByaW5naWt1anVsaXN0ZSB0cmFqZWt0b29yaWRlIGp1dXJkZSwgbWlzIHTDpGhlbmRhcywgZXQgc2VsbGVrcywgZXQgdGVtYSBtdWRlbCBmZW5vbWVuaWRlIHDDpMOkc3RtaXNlbCBow6R0dGEgZWkgasOkw6RrcyBqYSBhc3Ryb2xvb2dpZGVsZSBrYXN1dHUgZWkgb2xla3MsIG9saSB0YSBzdW5uaXR1ZCBtYWFkIGphIHBsYW5lZXRlIGxpaWd1dGFuYSDDvG1iZXIgcMOkaWtlc2UgbcO1w7VkYSBlcGl0c8O8a2xlaWQuIEtva2t1dsO1dHRlcyBvbGkgS29wZXJuaWt1IG11ZGVsIHNhbWEga2VlcnVsaW5lIGt1aSBQdG9sZW1haW9zZSBzdGFuZGFyZG11ZGVsIChuZWlzIG9saSB2w7VyZG5lIGFydiBlcGl0c8O8a2xlaWQpIGphIHNlbGxlIGFiaWwgdGVodHVkIGVubnVzdHVzZWQgcGxhbmVldGlkZSBsaWlrdW1pc2Uga29odGEgb2xpZCB2w6Rpa3NlbWEgdMOkcHN1c2VnYS4gCgogICAgICBLb3Blcm5pa3UgbXVkZWwgc3V1dGlzIHNhbWFzIGVubnVzdGFkYSBtw7VuaW5nYWlkIG7DpGh0dXNpIChwbGFuZWV0aWRlIG7DpGl2YQogICAgICBoZWxlZHVzZSBtdXV0dW1pbmUsIG1pcyBqw7V1YWIgbWFrc2ltdW1pIG5lbmRlIGzDpGhpbWFzIGFzdWtvaGFzIG1hYWxlKSwgbWlkYQogICAgICBQdG9sZW1haW9zZSBtdWRlbCBlaSBlbm51c3RhbnVkLiBTZWUgZWkgdMOkaGVuZGEsIGV0IG5lZWQgZmVub21lbmlkIG9sZWtzaWQKICAgICAgb2xudWQgdmFzdHVvbHVzIFB0b2xlbWFpb3NlIG11ZGVsaWdhLiBMaWh0c2FsdCwgbmVuZGUgUHRvbGVtYWlvc2UgbXVkZWxpc3NlCiAgICAgIHNvYml0YW1pc2VrcyBvbGkgdmFqYSBvc2FkIG11ZGVsaSBwYXJhbWVldHJpZCBmaWtzZWVyaWRhIG5paS3DtmVsZGEgc3V2YWxpc3RlbGUgdsOkw6RydHVzdGVsZS4gCiAgICAgIFNlZWdhIEtvcGVybmlrdSBtdWRlbCB0w7bDtnRhcyBuaWksIG5hZ3Ugc2VlIG9saSwgc2FtYXMga3VpIFB0b2xlbWFpb3NlIG11ZGVsIHZhamFzIGFkIGhvYyB0dXVuaW1pbXN0LiAgCgpLdWkgdmFhZGF0YSBLb3Blcm5pa3UgcHJvZHVrdGkgdGVvb3JpYW5hLCBtaXR0ZSBtdWRlbGluYSwgc2lpcyBvbGkgc2VsIHNlbGdlaWQgZWVsaXNlaWQgQXJpc3RvdGVsZXNlIGVlcy4gSnViYSBhbW11IG9saSBuw6RodHVkIGtvbWVldGUgw7xsZSB0YWV2YXbDtWx2aSBsZW5kYW1hcyAobWlzIEFyaXN0b3RlbGVzZSBqw6RyZ2kgYXN1c2lkIGtpbm5pc3TDpGh0ZWRlIG11dXR1bWF0dXMgc2bDpMOkcmlzKSBqYSBzdXBlcm5vb3ZhIHRla2tpbWlzdCBqYSBrYWR1LCBuaW5nIGVuYW0gZWkgb2xudWQga2F1Z2VsIGthIGFlZyBtaWwgR2FsaWxlbyBqb29uaXN0YXMgb21hIHRlbGVza29vYmlzdCBrcmFhdHJlaWQga3V1IHBpbm5hbCwgbsOkaWRhdGVzLCBldCBrdXUgZWkgc2FhbnVkIGtvb3NuZWRhIHTDpGl1c2xpa3VzdCB2aWllbmRhc3QgZWxlbWVuZGlzdCBqYSBldCBzZWxsZWwgdG9pbXVzaWQgaWxtc2VsdCBzYXJuYXNlZCBmw7zDvHNpa2FsaXNlZCBwcm90c2Vzc2lkIGt1aSBtYWFsLiBPbiB1c3V0YXYsIGV0IGt1aSBLb3Blcm5pa3VzIG9sZWtzIGrDtXVkbnVkIG9tYSByYWFtYXR1bGUgaXNlIGVzc8O1bmEga2lyanV0YWRhLCBvbGVrcyB0ZW1hIHRlb29yaWEgdmFzdHV2w7V0dCBvbG51ZCBwYWxqdSBraWlyZW0gKGphIHZhbHVsaXNlbSkuIFNlZWdhLCB0ZW9vcmlhIGphIG11ZGVsaSBlcmlzdHVzIG9uIHTDpGh0aXMhIAoKCgogICAgICBLb3Blcm5pa3UgdGVvb3JpYXN0IHR1bGVuZWIgbG9vZ2lsaXNlIHBhcmF0YW1hdHVzZW5hLCBldCB0w6RodGVkZWwgZXNpbmViCiAgICAgIG1hYXBlYWx0IHZhYWRhdGVzIHBhcmFsbGFrcy4gU2VlIHTDpGhlbmRhYiwgZXQga3VpIG1hYWtlcmEga29vcyBhc3Ryb25vb21pZ2EKICAgICAgdGVlYiBwb29scmluZ2kgw7xtYmVyIHDDpGlrZXNlLCBzaWlzIGtpbm5pc3TDpGhlIG7DpGl2IGFzdWtvaHQgdGFldmF2w7VsdmlsCiAgICAgIG11dXR1YiBzZXN0IGFzdHJvbm9vbSB2YWF0bGViIHRlZGEgdGVpc2UgbnVyZ2EgYWx0LiBQYW5nZSBvbWEgbmltZXRpc3PDtXJtCiAgICAgIG7DpG9zdCB1IDEwIGNtIGthdWd1c2VsZSwgc3VsZ2VnZSBwYXJlbSBzaWxtLCBzZWVqw6RyZWwgYXZhZ2Ugc2VlIG5pbmcgc3VsZ2VnZQogICAgICB2YXNhayBzaWxtIGphIHRlIG7DpGV0ZSBvbWEgc8O1cm1lIHBhcmFsbGFrc2kgc2VsbGUgbsOkaXZhIGFzdWtvaGEgbXV1dHVzZW5hLgogICAgICBUw6RodGVkZSBwYXJhbGxha3NpIHDDvMO8dGkgbcO1w7V0YSBqdWJhIEFsZWtzYW5kcmlhcyAxMDAwIGFhc3RhdCBlbm5lCiAgICAgIEtvcGVybmlrdXN0LCBldCBsZWlkYSBraW5uaXR1c3QgdGVvb3JpYWxlLCBtaWxsZSBrb2hhc2VsdCBtYWFrZXJhIHRpaXJsZWIKICAgICAgw7xtYmVyIHDDpGlrZXNlLiBNw7XDtXRtaXNlZCBlaSBuw6RpZGFudWQgYWdhIHBhcmFsbGFrc2kgb2xlbWFzb2x1IChzZXN0IG1hYQogICAgICB0cmFqZWt0b29yaSBkaWFtZWV0ZXIgb24gcGFsanUgbMO8aGVtIGt1aSBtYWEga2F1Z3VzIHTDpGh0ZWRlc3QpLiBQYXJhbGxha3NpCiAgICAgIG9sZW1hc29sdSBzYWkga2lubml0dXN0IGFsbGVzIDE5LiBzYWphbmRpIHRlaXNlbCBwb29sZWwsIHNpaXMga3VpIGp1YmEgYW1tdQogICAgICBpZ2Ega29vbGlqw7x0cyB1c2t1cywgZXQgbWFha2VyYSB0aWlybGViIMO8bWJlciBww6Rpa2VzZSEKICAgICAgCiAgICAgIAoKIyMjIE1pbGxlc3Qga29vc25lYiBtdWRlbD8KCj4gTXVkZWwgb24gbWF0ZW1hYXRpbGlzZSBmb3JtYWxpc20sIG1pcyBww7zDvGFiIGtpcmplbGRhZGEgZsO8w7xzaWthbGlzdCBwcm90c2Vzc2kuIAoKTsOkaXRla3MsIHNhZ2VsaSBraXJqZWxkYW1lIG1lIHByb2R1a3RpIGt1aGp1bWlzdCBlbnPDvMO8bXJlYWt0c2lvb25pcyBla3Nwb25lbnRzaWFhbHNlIGZ1bmt0c2lvbmkgKG11ZGVsaSkgYWJpbC4gS3VpIG1laWUgYW5kbWVkIHNlZGEgdMO8w7xwaSBmdW5rdGlvb25pZ2Egc29iaXZhZCwgw7x0bGViIHNlZSBtZWlsZSBtaWRhZ2kga29ua3JlZXRzZSBlbnPDvMO8bWkgdMO2w7ZtZWhoYW5pc21pIGtvaHRhLiBUZWlzZXN0IGvDvGxqZXN0LCBuZWVkIG11ZGVsaWQsIG1pcyBvbiAiZ2VuZXJhdGlpdnNlZCIsIHN1dWRhdmFkIGxpc2FrcyBzaW11bGVlcmlkYSBrYSB1dXNpIGFuZG1laWQuIFNlYWxodWxnYXMga2Egc2VsbGlzZWlkLCBtaWRhIHDDpHJpcyBtYWFpbG1hcyBlaSBzYWEga3VuYWdpIGVzaW5lZGEgc2VzdCBzZWFsIHB1dWR1dmFkIHZhc3RhdmFkIHRpbmdpbXVzZWQuIE11ZGVsaXNzZSBzYWFiIGFnYSBzaXNzZSBraXJqdXRhZGEgaWdhc3VndXNlaWQgdGluZ2ltdXNpIGVoayBwYXJhbWVldHJpIHbDpMOkcnR1c2kgKG7DpGl0IHN1YnN0cmFhZGkga29uc2VudHJhdHNpb29uZSwgbWlkYSBtZSBlaSBzdXVkYSAicMOkcmlzZWx0IiBzYWF2dXRhZGEpLiAKICAKT2xldGFtZSwgZXQgbWUgbcO1w7V0c2ltZSBOIGluaW1lc2UgcGlra3VzZSBjbS1zIGphIGthYWx1IGtnLXMgbmluZyBtZWlkIGh1dml0YWIsIGt1aWRhcyBpbmltZXN0ZSBwaWtrdXMgc8O1bHR1YiBuZW5kZSBrYWFsdXN0LiAgCgpMaWh0c2FpbSBtdWRlbCBwaWtrdXNlIHPDtWx0dXZ1c2VzdCBrYWFsdXN0IG9uIHBpa2t1cyA9IGthYWwgKGZvcm1hbGlzZWVyaXR1bHQ6IHkgPSB4KSBqYSBzZWUgbXVkZWwgZW5udXN0YWIsIGV0IGt1aSBKb2huaSBrYWFsID0gODAga2csIHNpaXMgSm9obiBvbiA4MCBjbSBwaWtrdW5lLiBTZWxsZSBtdWRlbGkgc2FhbWUgZ3JhYWZpbGlzZWx0IGt1anV0YWRhIG5paQogCmBgYHtyfQp4IDwtIDUwOjIwMCAjeSA9IGthYWwKeSA8LSB4ICMgeCA9IHBpa2t1cyAKcGxvdCh5fngsIHR5cGU9ImwiLCB4bGFiPSJ3ZWlnaHQgaW4ga2ciLCB5bGFiPSJoZWlndGggaW4gY20iLCBtYWluPSJmaXhlZCBsaW5lYXIgbW9kZWwiKQpgYGAKCmvDtWlnZXBlYWx0IHBhaW51dGFtZSBzaXJnZXQuIFNlZSBqb29uIG9uIGlra2EgdmVlbCB0w6RpZWxpa3VsdCBmaWtzZWVyaXR1ZCwgYWdhIHRhIHBvbGUgZW5hbSBzaXJnZSAoZWhraSB0ZWhuaWxpc2VsdCBvbiBtZWlsIGlra2EgbGluZWFhcm5lIHNlb3MgeCBqYSB5IHZhaGVsKQpgYGB7cn0KeCA8LSA1MDoyMDAKeSA8LSB4ICsgeCoqMgpwbG90KHgsIHksIHR5cGU9ImwiKQpgYGAKCgpNdWRlbGkga2VlbGVzIHTDpGhpc3RhbWUgbWUgc2VkYSwgbWlkYSBtZSBlbm51c3RhbWUgKGFudHVkIGp1aHVsIHBpa2t1cykgWS1nYSBqYSBzZWRhLCBtaWxsZSB2w6TDpHJ0dXNlIHDDtWhqYWwgbWUgZW5udXN0YW1lIChhbnR1ZCBqdWh1bCBrYWFsKSBYLWdhLiBTZWVnYSBzaXJnZSBtdWRlbGkgbWF0ZW1hYXRpbGluZSBmb3JtYWxpc20gb24gWSA9IFguIFNlZSBvbiDDpMOkcm1pc2VsdCBqw6RpayBtdWRlbDogdGEgb24gc2lyZ2Uga3VqdWxpbmUgamEgc2VsbGUgc2lyZ2UgYXN1a29odCBwYXJhbWVldHJpcnV1bWlzIG9uIHJhbmdlbHQgZmlrc2Vlcml0dWQuIFNpcmdlIGzDtWlrYWIgeSB0ZWxnZSBhbGF0aSAwLXMgKGVoayBtdWRlbGkga2VlbGVzOiBzZWxsZSBzaXJnZSBpbnRlcmNlcHQgZWhrIGzDtWlrZXB1bmt0IFkgdGVsamVsID0gMCkgamEgdGVtYSB0w7V1c3VudXJrIHNhYWIgb2xsYSBhaW51bHQgNDUga3JhYWRpIChtdWRlbGkga2VlbGVzOiBtdWRlbGkgc2xvcGUgZWhrIHTDtXVzID0gMSkuIFNlbGxlIG11ZGVsaSBqw6Rpa3VzIHR1bGVuZWIgc2VsbGVzdCwgZXQgc2VsbGVzIG11ZGVsaXMgZWkgb2xlIHBhcmFtZWV0cmVpZCwgbWlkYSBtZSBzYWFrc2ltZSB2YWJhbHQgbXV1dGEgZWhrIHR1dW5pZGEuICAKCkt1aWRhcyBhZ2Ega2lyamVsZGFkYSBzaXJnZXQsIG1pcyB2w7VpYiBwYWlrbmVkYSAyLW3DtcO1dG1lbGlzZXMgcnV1bWlzIMO8a3Nrw7VpayBtaWxsaXNlcyBhc2VuZGlzPyBTZWxsZWtzIGxpc2FtZSBtdWRlbGlzc2Uga2FrcyBwYXJhbWVldHJpdCwgaW50ZXJjZXB0IChhKSBqYSB0w7V1cyAoYikuIEt1aSBhPTAgamEgYj0wLCBzYWFtZSBtZSBlZWxwb29sIGtpcmplbGRhdHVkIG11ZGVsaSB5ID0geC4gS3VpIGEgPSAxMDIsIHNpaXMgc2lyZ2UgbMO1aWthYiB5IHRlbGdlIHbDpMOkcnR1c2VsIDEwMi4gS3VpIGIgPSAwLjgsIHNpaXMgeC1pIHTDtXVzdGVzIDEgw7xoaWt1IHbDtXJyYSB0w7V1c2ViIHktaSB2w6TDpHJ0dXMgMC44IMO8aGlrdSB2w7VycmEuIEt1aSBhID0gMTAwIGphIGIgPSAwLCBzaWlzIHNhYW1lIHNpcmdlLCBtaXMgb24gcGFyYWxlZWxuZSB4LXRlbGplZ2EgamEgbMO1aWthYiB5IHRlbGdlIHbDpMOkcnR1c2VsIDEwMCAobWlzIGp1aHR1Yiwga3VpIGEgPSBJbmY/KS4gU2VlZ2EsIFRlYWRlcyBhIGphIGIgdsOkw6RydHVzaSBuaW5nIG9taXN0YWRlcyB4LWxlIHN1dmFsaXNlIG1laWQgaHV2aXRhdmEgdsOkw6RydHVzZSwgc2FhYiBlbm51c3RhZGEgeS1pIGtlc2ttaXN0IHbDpMOkcnR1c3QuIE7DpGl0ZWtzLCBvbGd1IGFuZG1ldGUgdmFzdHUgZml0aXR1ZCBtdWRlbDogCgpwaWtrdXMoY20pID0gMTAyICsgMC44ICoga2FhbChrZykgZWhrIAoKeSA9IDEwMiArIDAuOHguIAoKT21pc3RhZGVzIG7DvMO8ZCBrYWFsdWxlIHbDpMOkcnR1c2UgODAga2csIHR1bGViIG11ZGVsaSBwb29sdCBlbm51c3RhdHVkIGtlc2ttaW5lIHBpa2t1cyAxMDIgKyAwLjggKiA4MCA9IDE2NiBjbS4gSWdhIGtnIGxpc2FrYWFsdSBlbm51c3RhYiBtdWRlbGkga29oYXNlbHQgMC44IGNtIHbDtXJyYSBzdXVyZW1hdCBwaWtrdXN0LgoKCmBgYHtyfQphIDwtIDEwMgpiIDwtIDAuOAp4IDwtICAwOjEwMCAKeSA8LSAgYSArIGIgKiB4CnBsb3QoeX54LCB0eXBlPSJsIiwgeGxhYj0id2VpZ2h0IGluIGtnIiwgeWxhYj0iaGVpZ3RoIGluIGNtIiwgbWFpbj0iYSBtb3JlIGZsZXhpYmxlIGxpbmVhciBtb2RlbCIsIHlsaW09Yyg1MCwgMjAwKSkKYGBgCgpTZWUgbXVkZWwgZW5udXN0YWIsIGV0IDAga2FhbHUganV1cmVzIG9uIHBpa2t1IDEwMiBjbSwgbWlzIG9uIHJ1bWFsLCBhZ2EgbXVkZWxpdGUgcHVodWwgdGF2YWxpbmUsIG9sdWtvcmQuIE1lIHR1dW5pbWUgbXVkZWxpdCBhbmRtZXRlIHBlYWwsIG1pcyBlaSBzaXNhbGRhIDAta2FhbHUgKHNlc3QgMC1rYWFsdWdhIGluaW1lc2kgcG9sZSBvbGVtYXMpLiBNZWllIHZhbGltaWFuZG1lZCBlaSBwZWVnZWxkYSB0w6Rwc2VsdCBpbmltcG9wdWxhdHNpb29uaS4gU2lyZ2UgbXVkZWwgZWkgcGVlZ2VsZGEgdMOkcHNlbHQgcGlra3VzZS1rYWFsdSBzdWh0ZWlkIHZhaGVtaWt1cywga3VzIG1laWwgb24gcmVhYWxzZWlkIGthYWx1YW5kbWVpZDsgamEgdGEgdGVlYiBzZWRhIHZlZWxnaSB2w6RoZW0gc2VhbCwga3VzIG1laWwgbcO1w7VkZXR1ZCBrYWFsdXNpZCBlaSBvbGUuIFNlZWdhIHBvbGUgbcO1dGV0IGltZXN0YWRhLCBtaWtzIG11ZGVsaSBpbnRlcmNlcHQgbWVpZSDDvGxlIGlydml0YWIuICAKCgoKIyMjIDQgbcO1aXN0ZXQgCgpYIGphIFkgb24gbXV1dHVqYWQsIGEgamEgYiBvbiBwYXJhbWVldHJpZC4gTXV1dHVqYXRlIHbDpMOkcnR1c2VkIGZpa3NlZXJpdGFrc2UgYW5kbWV0ZSBwb29sdCwgcGFyYW1lZXRyaWQgZml0aXRha3NlIG11dXR1amF0ZSB2w6TDpHJ0dXN0ZSBww7VoamFsLiBGaXRpdHVkIG11ZGVsIGVubnVzdGFiIGlnYWxlIFgtaSB2w6TDpHJ0dXNlbGUgdmFzdGF2YSBrw7VpZ2UgdMO1ZW7DpG9saXNlbWEgWSB2w6TDpHJ0dXNlIChZIGtlc2t2w6TDpHJ0dXNlIHNlbGxlbCBYLWkgdsOkw6RydHVzZWwpLgogCiA+IFkgLSBtaWRhIG1lIGVubnVzdGFtZSAoZGVwZW5kZW50IHZhcmlhYmxlLCBwcmVkaWN0ZWQgdmFyYWJsZSkKIAogPiBYIC0gbWlsbGUgcMO1aGphbCBtZSBlbm51c3RhbWUgKGluZGVwZW5kZW50IHZhcmlhYmxlLCBwcmVkaWN0b3IpCiAKID4gbXV1dHVqYSAodmFyaWFibGUpIC0gaWdhIGFzaSwgbWlkYSBtZSB2YWxpbWlzIG3DtcO1ZGFtZSAoWCBqYSBZIG9uIGtha3MgbXV1dHVqYXQpLiBNdXV0dWphIHbDpMOkcnR1c2VkIG9uIGZpa3NlZXJpdHVkIGFuZG1ldGUgcG9vbHQuIE11dXR1amFsIG9uIHNhbWEgcGFsanUgZmlrc2Vlcml0dWQgdsOkw6RydHVzaSBrdWkgbWVpbCBvbiBzZWxsZSBtdXV0dWphIGtvaHRhIG3DtcO1dG1pc2FuZG1laWQuCiAKID4gcGFyYW1lZXRlciAocGFyYW1ldGVyKSAtIG11ZGVsaSBrb2VmaXRzaWVudCwgbWlsbGVsZSB2w7VpYiBvbWlzdGFkYSBzdXZhbGlzaSB2w6TDpHJ0dXNpLiBQYXJhbWVldHJlaWQgdHV1bmlkZXMgZml0aW1lIG1lIG11ZGVsaSB2w7VpbWFsaWt1bHQgaMOkc3RpIHNvYml0dW1hIGFuZG1ldGVnYS4KCiMjIyBNdWRlbGkgZml0dGltaW5lCgpNdWRlbGlkIHNpc2FsZGF2YWQgKDEpIG1hdGVtYWF0aWxpc2kgc3RydWt0dXVyZSwgbWlzIG3DpMOkcmF2YWQgbXVkZWxpIHTDvMO8YmkgbmluZyAoMikgcGFyYW1lZXRyZWlkLCBtaWRhIHNhYWIgYW5kbWV0ZSBww7VoamFsIHR1dW5pZGEsIG5paXZpaXNpIHTDpHBzdXN0YWRlcyBtdWRlbGkga3VqdS4gCgpTZWRhIHR1dW5pbWlzdCBuaW1ldGF0YWtzZSBtdWRlbGkgZml0dGltaXNla3MuIE11ZGVsaXQgZml0dGlkZXMgb24gZWVzbcOkcmsgc2FhdnV0YWRhIGFudHVkIHTDvMO8cGkgbXVkZWxpIG1ha3NpbWFhbG5lIHNvYml2dXMgYW5kbWV0ZWdhLiBOw6RpdGVrcyB2w7VycmFuZCB5ID0gYSArIGJ4IG3DpMOkcmFiIG11ZGVsaSwga3VzIHkgPSB4IG9uIG9uIHNlZSBzdHJ1a3R1dXIsIG1pcyB0YWdhYiwgZXQgbXVkZWxpIHTDvMO8cCBvbiBzaXJnZSwgbmluZyBhIGphIGIgb24gcGFyYW1lZXRyaWQsIG1pcyBtw6TDpHJhdmFkIHNpcmdlIGFzZW5kaS4gU2VldmFzdHUgc3RydWt0dXVyIHkgPSB4ICsgeF4yIHRhZ2FiLCBldCBtdWRlbGkgeSA9IGEgKyBiMXggKyBiMnheMiAgdMO8w7xwIG9uIHBhcmFib29sLCBuaW5nIHBhcmFtZWV0cml0ZSBhLCBiMSBqYSBiMiB2w6TDpHJ0dXNlZCBtw6TDpHJhdmFkIHNlbGxlIHBhcmFib29saSB0w6Rwc2Uga3VqdS4gSmEgbmlpIGVkYXNpIAogIAogSGVhIG11ZGVsIG9uIAogCiAoMSkgdsO1aW1hbGlrdWx0IGxpaHRzYSBzdHJ1a3R1dXJpZ2EsIG1pbGxlIHDDtWhqYWwgb24gdmVlbCB2w7VpbWFsaWsgdGVoYSBqw6RyZWxkdXNpIHByb3RzZXNzaSBrb2h0YSwgbWlzIGdlbmVyZWVyaXMgbXVkZWxpIHZhbG1pc3RhbWlzZWtzIGthc3V0YXR1ZCBhbmRtZWlkOyAKIAogKDIpIHNvYml0dWIgcGlpc2F2YWx0IGjDpHN0aSBhbmRtZXRlZ2EgKGVyaXRpIHV1dGUgYW5kbWV0ZWdhLCBtaWRhIGVpIGthc3V0YXR1ZCBzZWxsZSBtdWRlbGkgZml0dGltaXNla3MpLCBldCBvbGxhIHJlbGV2YW50bmUgYW5kbWVpZCBnZW5lcmVlcml2YSBwcm90c2Vzc2kga2lyamVsZHVzOyAKIAogKDMpIGdlbmVyZWVyaWIgdXN1dGF2YWlkIHNpbXVsZWVyaXR1ZCBhbmRtZWlkIChzZWUgbsOkaXRhYiBtdWRlbGkga3ZhbGl0ZWV0aSkuCiAKIFNhZ2VsaSBmaXRpdGtzZSBzYW1hZGUgYW5kbWV0ZWdhIG1pdHUgZXJpbmV2YXQgdMO8w7xwaSBtdWRlbGl0IGphIHDDvMO8dGFrc2Ugb3RzdXN0YWRhLCBtaWxsaW5lIG5laXN0IHZhc3RhYiBrw7VpZ2UgcGFyZW1pbmkgZWVsdG9vZHVkIHRpbmdpbXVzdGVsZS4gTsOkaXRla3MsIGt1aSBzaXJnZSBzdXVkYWIga2FhbHUgasOkcmdpIHBpa2t1c3QgZW5udXN0YWRhIHBhcmVtaW5pIGt1aSBwYXJhYm9vbCwgc2lpcyBvbiBzaXJnZSBtdWRlbCBrb29za8O1bGFzIHRlYWR1c2xpa3UgaMO8cG90ZWVzaWdhLCBtaXMgYW5uYWtzIG1laGhhbmlzbWkgcHJvdHNlc3NpbGUsIG1pbGxlIGvDpGlndXMga2lsb2RlIGxpc2FuZHVtaW5lIHZpaWtzIGxhaWFzIGthYWx1dmFoZW1pa3VzIGluaW1lc3RlIHBpa2t1c2Uga2FzdnVsZSBpbG1hLCBldCBwaWtrdXNlIGthc3Z1IHRlbXBvIGxhbmdla3MuIAogIAojIyMjw5xsZS0gamEgYWxhZml0dGltaW5lCiAgCiAgT3NhZCBtdWRlbGl0ZSB0w7zDvGJpZCBvbiB2w6RoZW0gcGFpbmRsaWt1ZCBrdWkgdGVpc2VkIChwYXJhbWVldHJlaWQgdHV1bmlkZXMgb24gbmVpbCB2w6RoZW0gbGlpa3VtaXNydXVtaSkuIEt1aWdpIHNlbGxpc2VkIG11ZGVsaWQgc29iaXR1dmFkIGhhbHZlbWluaSBhbmRtZXRlZ2EsIHbDtWl2YWQgbmVlZCAgaWtrYWdpIHBhcmVtaW5pIGt1aSBtw7VuaSBwYWluZGxpa3VtIG11ZGVsIHbDpGxqYSB0dXVhIGFuZG1ldGUgcGVpZGV0dWQgb2xlbXVzZS4gTXVkZWxkYW1pbmUgZWVsZGFiLCBldCBtZSB1c3VtZSwgZXQgbWVpZSBhbmRtZXRlcyBsZWlkdWIgbmlpIG3DvHJhIChtaWRhIG11ZGVsIHbDtWlrcyBpZ25vcmVlcmlkYSksIGt1aSBzaWduYWFsIChtaWRhIG11ZGVsIHDDvMO8YWIgdGFiYWRhKS4gS3VuYSBtdWRlbGkgamFva3MgbsOkZWIgbcO8cmEgc2FtYW1vb2RpIHbDpGxqYSBrdWkgc2lnbmFhbCwgb24gaWdhIG11ZGVsIGtvbXByb21pc3Mgw7xsZS0gamEgYWxhZml0dGltaXNlIHZhaGVsLiBNZSBsaWh0c2FsdCBsb29kYW1lLCBldCBtZWllIG11ZGVsIG9uIHBpaXNhdmFsdCBqw6RpaywgZXQgbWl0dGUgbGlpZ2EgcGFsanUgbcO8cmEgbW9kZWxsZWVyaWRhIGphIHNhbWFzIHBpaXNhdmFsdCBwYWluZGxpaywgZXQgcGlpc2F2YWwgbcOkw6RyYWwgc2lnbmFhbGkgdGFiYWRhLgogIAogIMOca3Mga8O1aWdlIGrDpGlnZW1haWQgbXVkZWxlaWQgb24gc2lyZ2UsIG1pcyB0w6RoZW5kYWIsIGV0IHNpcmdlIG11ZGVsIG9uIHN1dXJlIHTDtWVuw6Rvc3VzZWdhIGFsYWZpdHRpdHVkLiBLZWVyYSBzaXJnZXQga3VpcGFsanUgdGFoYWQsIGlra2EgZWkgc29iaXR1IHRhIGVuYW1pa3UgYW5kbWVrb2d1ZGVnYS4gSmEgbmVlZCB2w6RoZXNlZCBhbmRtZWtvZ3VkLCBtaXMgc2lyZ2UgbXVkZWxpZ2Egc29iaXZhZCwgb24gZ2VuZXJlZXJpdHVkIHRlYXR1ZCB0w7zDvHBpIGxpbmVhYXJzZXRlIHByb3RzZXNzaWRlIHBvb2x0LiBTaXJnZSBvbiBzZWVnYSDDvGtzIGvDtWlnZSBwYXJlbWluaSB0w7VsZ2VuZGF0YXZhaWQgbXVkZWxlaWQuIFRlaXNlcyDDpMOkcm11c2VzIG9uIHBvbMO8bm9vbXNlZCBtdWRlbGlkLCBtaXMgb24gdsOkZ2EgcGFpbmRsaWt1ZCwgbWlkYSBvbiB2w6RnYSByYXNrZSB0w7VsZ2VuZGFkYSBqYSBtaWxsZSBwdWh1bCBvbiBzdXVyIG11ZGVsaSDDvGxlZml0dGltaXNlIG9odC4gw5xsZWZpdGl0dWQgbXVkZWwgasOkcmdpYiBuaWkgdMOkcHNlbHQgdmFsaW1pYW5kbWVpZCwgZXQgc29iaXR1YiBow6RzdGkgdmFsaW1pcyBsZWlkdXZhIGp1aHVzbGlrdSBtw7xyYWdhIG5pbmcgc2VldMO1dHR1IHNvYml0dWIgaGFsdmFzdGkgasOkcmdtaXNlIHZhbGltaWdhIHNhbWFzdCBwb3B1bGF0c2lvb25pc3QgKHNlc3QgaWdhbCB2YWxpbWlsIG9uIG9tYSBqdWh1c2xpayBtw7xyYSkuIMOcbGRpc2VsdCwgbWlkYSByb2hrZW0gb24gbXVkZWxpcyB0dXVuaXRhdmFpZCBwYXJhbWVldHJlaWQsIHNlZGEgcGFpbmRsaWt1bSBtdWRlbCwgc2VkYSBrZXJnZW0gb24gc2VkYSB2YWxpbWlhbmRtZXRlZ2Egc29iaXRhZGEgamEgc2VkYSByYXNrZW0gb24gc2VkYSBtdWRlbGl0IHTDtWxnZW5kYWRhLiBWZWVsZ2kgZW5hbSwgYWxhdGkgb24gdsO1aW1hbGlrIGtvbnN0cnVlZXJpZGEgbXVkZWwsIG1pcyBzb2JpdHViIHTDpGl1c2xpa3VsdCBsw7VwbGlrdSBhcnZ1IGFuZG1lcHVua3RpZGVnYSAoc2VsbGUgbXVkZWxpIHBhcmFtZWV0cml0ZSBhcnYgPSBOKS4gU2VsbGluZSBtdWRlbCBvbiB0w6Rwc2VsdCBzYW1hIGluZm9ybWF0aWl2bmUga3VpIGFuZG1lZCwgbWlsbGUgcMO1aGphbCBzZWUgZml0aXRpIC0tLSBqYSB0w6RpZXN0aSBrYXN1dHUuCiAgCiAgCmBgYHtyIGVjaG89RkFMU0V9CmRmIDwtIHRpYmJsZSh4PWMoMiwgMywgMi4yLCA1LCA3LCA4KSwgeT1jKDgsIDUsIDksIDEwLCAxMSwgMTAuMSkpCm1vZF9lMSA8LSBsbSh5IH4geCwgZGF0YSA9IGRmKQptb2RfZTIgPC0gbG0oeSB+IHBvbHkoeCwgMiksIGRhdGEgPSBkZikKbW9kX2UzIDwtIGxtKHkgfiBwb2x5KHgsIDMpLCBkYXRhID0gZGYpCm1vZF9lNCA8LSBsbSh5IH4gcG9seSh4LCA0KSwgZGF0YSA9IGRmKQptb2RfZTUgPC0gbG0oeSB+IHBvbHkoeCwgNSksIGRhdGEgPSBkZikKCmRmICU+JSAKICB0aWR5cjo6ZXhwYW5kKGRmKSAlPiUgCiAgZ2F0aGVyX3ByZWRpY3Rpb25zKG1vZF9lMSwgbW9kX2UyLCBtb2RfZTMsIG1vZF9lNCwgbW9kX2U1KSAlPiUgCiAgZ2dwbG90KGFlcyh4LCBwcmVkLCBjb2xvdXIgPSBtb2RlbCkpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludChhZXMoeCwgeSksIGNvbG9yPSJibGFjayIsIHNpemU9MikgCgpgYGAKKkpvb25pczogS2FzdmF2YSBwYWluZGxpa3VzZWdhIHBvbMO8bm9vbXNlZCBtdWRlbGlkLiBtb2RfZTEgb24gc2lyZ2UgdsO1cnJhbmQgeSA9IGEgKyBiMXggKDIgcGFyYW1lZXRyaXQ6IGEgamEgYjEpLCBtb2RfZTIgb24gbGlodHNhaW0gdsO1aW1hbGlrIHBvbMO8bm9vbTogeT0gYSArIGIxeCArIGIyeF4yICgzIHBhcmFtZWV0cml0KSwgLi4uLCBtb2RfZTU6IHk9IGEgKyBiMXggKyBiMnheMiArIGIzeF4zICsgYjR4XjQgKyBiNXheNSAoNiBwYXJhbWVldHJpdCkuIG1vZF9lNSB2YXN0YWIgdMOkcHNlbHQgYW5kbWVwdW5rdGlkZWxlIChOID0gNikuKgoKYGBge3J9CkFJQyhtb2RfZTEsIG1vZF9lMiwgbW9kX2UzLCBtb2RfZTQsIG1vZF9lNSkKYGBgCgpBSUMgbsOkaXRhYiwgZXQgcGFyaW0gbXVkZWwgb24gbW9kX2U0LiBBZ2Ega2FzIHNlZSBvbiBrYSBrw7VpZ2Uga2FzdWxpa3VtIG11ZGVsPyBNaXMgc2lpcywga3VpIDMtcyBhbmRtZXB1bmt0IG9uIGFuZG1lc2lzZXN0YWphIG7DpHB1dmlnYT8KCiAgICBBSUMgLSBBa2Fpa2UgSW5mb3JtYXRzaW9vbmkgS3JpdGVlcml1bSAtIHZhYXRhYiBtdWRlbGkgc29iaXZ1c3QgYW5kbWV0ZWdhCiAgICBqYSBtdWRlbGkgcGFyYW1lZXRyaXRlIGFydnUuIAogICAgVsOkaWtzZWltIEFJQyB0w6RoaXRhYiBwYXJpbWF0IGZpdHRpIHbDpGlrc2VpbWEgcGFyYW1lZXRyaXRlIGFydnUganV1cmVzCiAgICAoa29tcHJvbWlzc2kpIGphIHbDpGlrc2VpbWEgQUlDLWdhIG11ZGVsIG9uIGVlbGlzdGF0dWltIG11ZGVsLiBBZ2Egc2VkYSBhaW51bHQKICAgIHbDtXJyZWxkdWQgbXVkZWxpdGUgaHVsZ2FzLiBBSUMtaSBhYnNvbHV1dHbDpMOkcnR1cyBlaSBsb2UgLSBzZWUgb24gc3VodGVsaW5lIG7DpGl0YWphLiAgCgpgYGB7ciwgZWNobz1GQUxTRX0KYTEgPC0gZ2xhbmNlKG1vZF9lMSkKYTIgPC0gZ2xhbmNlKG1vZF9lMikKYTM8LSBnbGFuY2UobW9kX2UzKQphNDwtIGdsYW5jZShtb2RfZTQpCmEgPC0gYmluZF9yb3dzKGExLGEyLGEzLGE0KQpwbG90KDI6NSwgYSRyLnNxdWFyZWQsIHR5cGU9ImwiLCB4bGFiPSJuciBvZiBwYXJhbWV0ZXJzIiwgeWxhYj0iUiBzcXVhcmVkIikKYGBgCipKb29uaXM6IHNlZGFtw7bDtmRhIGt1aWRhcyBwYXJhbWVldHJpdGUgYXJ2IG11ZGVsaXMga2FzdmFiLCBrYXN2YWIga2EgUiBydXV0LiBSIHJ1dXQgMC44IHTDpGhlbmRhYiwgZXQgeC1pIHZhcmllZXJ1dnVzIHN1dWRhYiBzZWxldGFkYSBrdW5pIDgwJSB5LWkgdmFyaWVlcnV2dXNlc3QuIExpc2FwYXJhbWVldHJpIGxpc2FtaW5lIGVpIHNhYSBww7VoaW3DtXR0ZWxpc2VsdCBSIHJ1dXR1IHbDpGhlbmRhZGEuIEFnYSBzZWxsZSBrYXN2dSBraWlydXMgb24gYWVnbHVzdHV2LiDDnGhlbCBoZXRrZWwgZWkgw7VpZ3VzdGEgbXVkZWxpIGZpdGkgcGFyYW5lbWluZSBlbmFtIG11ZGVsaSBwYWluZGxpa3VzZSBrYXN2dSAobWlzIG3DtWxlbWFkIHNhYXZ1dGF0YWtzZSBwYXJhbWVldHJlaWQgbGlzYWRlcykuKgoKICAgIMOcbGVmaXR0aW1pc2UgdsOkbHRpbWlzZWtzIGthc3V0YXZhZCBCYXllc2kgbXVkZWxpZCBpbmZvcm1hdGlpdnNlaWQgcHJpb3JlaWQsIAogICAgbWlzIHbDpGxpc3RhdmFkIGVrc3RyZWVtc2VkIHBhcmFtZWV0cml2w6TDpHJ0dXNlZC4gCiAgICBWdCBodHRwOi8vZWxldmFudGgub3JnL2Jsb2cvMjAxNy8wOC8yMi90aGVyZS1pcy1hbHdheXMtcHJpb3ItaW5mb3JtYXRpb24vIAoKCgojIyNWZWFtdWRlbAogIApFZWxwb29sIGtpcmplbGRhdHVkIG11ZGVsaWQgb24gZGV0ZXJtaW5pc3RsaWt1ZCAtLS0gbmFkIGVpIHNpc2FsZGEgaGlubmFuZ3V0IGFuZG1ldGUgdmFyaWVlcnV2dXNlbGUgZW5udXN0dXNlIMO8bWJlci4gTmVpZCBrdXRzdXRha3NlIGthICoqcHJvdHNlc3NpIG11ZGVsaXRla3MqKiBzZXN0IG5hZCBtb2RlbGxlZXJpdmFkIHByb3RzZXNzaSB0w6Rwc2VsdC4gRWhrIGt1aSBtdWRlbCBlbm51c3RhYiwgZXQgODAga2cgaW5pbWVuZSBvbiAxNjYgY20gcGlra3VuZSwgc2lpcyBwcm90c2Vzc2kgbXVkZWwgZWkgw7x0bGUsIGt1aSBzdXVydCBrYWFsdXN0IHPDtWx0dW1hdHV0IHBpa2t1c3RlIHZhcmllZXJ1dnVzdCB2w7VpbWUgb29kYXRhIDgwIGtnLXN0ZSBpbmltZXN0ZSBodWxnYXM/IFNlbGxlIGhpbm5hbmd1IGFuZG1pc2VrcyB0dWxlYiBtdWRlbGlsZSBsaXNhZGEgdmVlbCDDvGtzIGtvbXBvbmVudCwgKip2ZWFtdWRlbCoqIGVoayB2ZWFrb21wb25lbnQsIG1pcyBzYWdlbGkgdHV1YWtzZSBzaXNzZSBub3JtYWFsamFvdHVzZSBrdWp1bC4gVmVha29tcG9uZW50IG1vZGVsbGVlcmliIMO8a3Npa3V0ZSBpbmltZXN0ZSBwaWtrdXN0ZSB2YXJpZWVydXZ1c3QgKG1pdHRlIGtlc2ttaXNlIHBpa2t1c2UgdmFyaWVlcnV2dXN0KSBpZ2FsIG3DtWVsZGF2YWwgamEgbWl0dGVtw7VlbGRhdmFsIGthYWx1bC4gVMOkbnUgc2VsbGVsZSBlaSBvbGUgbXVkZWxpIGVubnVzdHVzZWQgZW5hbSBkZXRlcm1pbmlzdGxpa3VkLCB2YWlkIHTDtWVuw6Rvc3VzbGlrdWQuIAoKS3VpZGFzIHZlYWtvbXBvbmVudCBsaW5lYWFyc2Vzc2UgbXVkZWxpc3NlIHNpc3NlIHR1dWE/CgppbG1hIHZlYWtvbXBvbmVuZGl0YSBtdWRlbDogKnkgPSBhICsgYngqCgpWZWFrb21wb25lbnQgdMOkaGVuZGFiLCBldCB5LWkgdsOkw6RydHVzIHZhcmllZXJ1YiDDvG1iZXIgbXVkZWxpIHBvb2x0IGVubnVzdGF0dWQga2Vza3bDpMOkcnR1c2UgamEgc2VkYSB2YXJpZWVydXZ1c3Qgbm9ybWFhbGphb3R1c2VnYSBtb2RlbGxlZXJpZGVzIHNhYW1lCgoqeSB+IGRub3JtKG11LCBzaWdtYSkqIAoKa3VzICptdSogb24gbXVkZWxpIHBvb2x0IGVubnVzdGF0dWQga2Vza3bDpMOkcnR1cyBqYSAqc2lnbWEqIG9uIG11ZGVsaSBwb29sdCBlbm51c3RhdHVkIHN0YW5kYXJkaMOkbHZlIGVoayB2YXJpZWVydXZ1cyBhbmRtZXB1bmt0aWRlIHRhc2VtZWwuIFRpbGRlIH4gdMOkaGlzdGFiIHNlb3NlIHTDtWVuw6Rvc3VzbGlra3VzdC4KClNpcmdlIG11ZGVsaXNzZSB2YXJpZWVydXZ1c2Ugc2lzc2UgdG9vbWlzZWtzIGRlZmluZWVyaW1lIG11IMO8bWJlciBuw7VuZGE6CgoqbXUgPSBhICsgYngqLCBtaXMgdMOkaGVuZGFiLCBldAoKKnkgfiBkbm9ybShhICsgYngsIHNpZ21hKSoKClNlZSBvbmdpIHNpcmdlIG11ZGVsIGtvb3MgdmVha29tcG9uZW5kaWdhLiBQZWF0w7xraXMgMyDDtXBpbWUgbWUgc2VsbGlzdGUgbXVkZWxpdGVnYSB0w7bDtnRhbWEuCgoKPiBLw7VpayBzdGF0aXN0aWxpc2VkIG11ZGVsaWQgb24gdMO1ZW7DpG9zdXNtdWRlbGlkIG5pbmcgc2lzYWxkYXZhZCB2ZWFrb21wb25lbnRpLiAKCgojIyNTdGF0aXN0aWxpbmUgbXVkZWwga29vc25lYiAzIGtvbXBvbmVuZGlzdDogCiAgICAKICAgID4gKDEpIG1hdGVtYWF0aWxpbmUgc3RydWt0dXVyLCBtaXMgc2lzYWxkYWIgbXV1dHVqYWlkIGphIGFubmFiIG11ZGVsaSB0w7zDvGJpLCAKICAgIAogICAgPiAoMikgdHV1bml0YXZhZCBwYXJhbWVldHJpZCBqYSAKICAgIAogICAgPiAoMykgdmVhbXVkZWwuCgpNdWlkZSwga8O1aWsgdmVhbXVkZWxpZCwgbWlsbGVnYSBtZSBlZGFzcGlkaSB0w7bDtnRhbWUsIG1vZGVsbGVlcml2YWQgaWdhbGUgeC1pIHbDpMOkcnR1c2VsZSAoa2FhbHVsZSkgc2FtYSBzdXVyZSB5LWkgc3V1bmFsaXNlIHZhcmllZXJ1dnVzZSAocGlra3VzdGUgc2QpLiBTdXVyZW0gb3NhIHN0YXRpc3Rpa2FzdCBrYXN1dGFiIGVlbGR1c2ksIG1pZGEga2VlZ2kgcMOkcmlzZWx0IHTDtWUgcMOkaGUgZWkgdsO1dGEsIGFnYSBtaWxsZWdhIG9uIGFydnV0dXNsaWt1cyBtw7V0dGVzIGxpaHRzYW0gZWxhZGEuCgoKIyMjIyBFbmlta2FzdXRhdHVkIHZlYW11ZGVsIG9uIG5vcm1hYWxqYW90dXMuIAoKT2xldGFtZSwgZXQgbWVpbCBvbiBrb2xtIGFuZG1lcHVua3RpIG5pbmcgbWUgdXN1bWUsIGV0IG5lZWQgYW5kbWVkIG9uIGp1aHVzbGlrdWx0IHTDtW1tYXR1ZCBub3JtYWFsamFvdHVzZXN0IHbDtWkgc2VsbGVsZSBsw6RoZWRhc2VzdCBqYW90dXNlc3QuIE5vcm1hYWxqYW90dXNlIG11ZGVsaXQga2FzdXRhZGVzIG1lIHNpc3VsaXNlbHQgZGVrbGFyZWVyaW1lLCBldCBtZSB1c3VtZSwgZXQga3VpIG1lIG9sZWtzaW1lIG9sbnVkIHbDpGhlbSBsYWlzYWQgamEgMyBtw7XDtXRtaXNlIGFzZW1lbCBzb29yaXRhbnVrcyAzMDAwLCBzaWlzIG5lZWQgbcO1w7V0bWlzZWQgc29iaXR1a3NpZCBwaWlzYXZhbHQgaMOkc3RpIG1laWUgMyB2w6TDpHJ0dXNlIHBlYWwgZml0aXR1ZCBub3JtYWFsamFvdHVzZWdhLiBTZWVnYSwgbWUgdXN1bWUsIGV0IG9tYWRlcyAzIGFuZG1lcHVua3RpIG1lIHRlYW1lIGp1YmEgdW1ia2F1ZHUsIG1pbGxpc2VkIHR1bGVtdXNlZCBtZSBvbGVrc2ltZSBzYWFudWQga29yamF0ZXMgbsOkaXRla3MgMyBtaWxqb25pdCBhbmRtZXB1bmt0aS4gT21hIG11ZGVsaXN0IHbDtWltZSBzaW11bGVlcmlkYSDDvGtza8O1aWsga3VpIHBhbGp1IGFuZG1lcHVua3RlLiAKCkFnYSBwaWRhZ2UgbWVlbGVzLCBldCBzZWxsZSBtdWRlbGkgZml0dGltaXNla3Mga2FzdXRhbWUgbWUgYWludWx0IG5laWQgYW5kbWVpZCwgbWlzIG1laWwgcMOkcmlzZWx0IG9uIC0tLSBqYSBrdWkgbWVpbCBvbiBhaW51bHQgMyBhbmRtZXB1bmt0aSwgb24gdMO1ZW7DpG9saW5lLCBldCBmaXRpdHVkIG11ZGVsIGVpIGthamFzdGEgaMOkc3RpIHRlZ2VsaWtrdXN0LiAKCj4gSGFsdmFkIGFuZG1lZCBlaSBhbm5hIGt1bmFnaSBoZWFkIHR1bGVtdXN0LiAKCkVlbG5ldiBlaSBrZWh0aSBCYXllc2kgbXVkZWxpdGUga29odGEsIG1pcyB0b292YWQgcHJpb3JpdGUga2F1ZHUgc2lzc2UgbGlzYWluZm90LCBtaXMgZWkga2FqYXN0dSB2YWxpbWlhbmRtZXRlcyBqYSB2w7VpYiBhbmFsw7zDvHNpIHDDpMOkc3RhLgoKS3VpZGFzIHBhbm5hIHNrZXB0aWsgdXNrdW1hLCBldCBzdGF0aXN0aWxpc2VkIG1lZXRvZGlkIHTDtsO2dGF2YWQgaGFsdmFzdGkgdsOkaWtlc3RlbCB2YWxpbWl0ZWw/IFNpaW4gYWl0YWIgc2ltdWxhdHNpb29uLCBrdXMgbWUgdMO1bWJhbWUgMy1zZSB2YWxpbWkgZXR0ZWFudHVkIHBvcHVsYXRzaW9vbmlzdCBuaW5nIMO8cml0YW1lIHNlbGxlIHZhbGltaSBww7VoamFsIGVubnVzdGFkYSBzZWxsZWFzYW1hIHBvcHVsYXRzaW9vbmkgc3RydWt0dXVyaS4gS3VuYSB0ZWdlbWlzdCBvbiBzaW11bGF0c2lvb25pZ2EsIHRlYW1lIHTDpHBzZWx0LCBldCBwb3B1bGF0c2lvb24sIGt1c3QgbWUgdMO1bWJhbWUgb21hIGtvbG1lc2UgdmFsaW1pLCBvbiBub3JtYWFsamFvdHVzZWdhLCBldCB0ZW1hIGtlc2t2w6TDpHJ0dXMgPSAwIGphIGV0IHRlbWEgc2QgPSAxLiBNZSBmaXRpbWUgb21hIHZhbGltaSBhbmRtZXRlZ2EgMiBlcmluZXZhdCBtdWRlbGl0OiBub3JtYWFsamFvdHVzZSBqYSBTdHVkZW50aSB0IGphb3R1c2UuIAogIApgYGB7ciBlY2hvPUZBTFNFfQpsaWJyYXJ5KGJybXMpICN0IGphb3R1c2UgbW9kZWxsZWVyaW1pc2VrcwojcGFrZXR0IGdnZm90aWZ5IHBha3ViIGFsdCBsYWhlbmR1c3QgamFvdHVzdGUgam9vbmlzdGFtaXNla3MKc2V0LnNlZWQoMTkpCmRmIDwtIHRpYmJsZShhPXJub3JtKDMpKQoKZGYgJT4lIGdncGxvdChhZXMoeD1hKSkgKwogIGdlb21fZG90cGxvdCgpICsgCiAgc3RhdF9mdW5jdGlvbihmdW49ZG5vcm0sIGFyZ3M9bGlzdChtZWFuPW1lYW4oZGYkYSksc2Q9c2QoZGYkYSkpLCBjb2xvdXI9InJlZCIpICsKICBzdGF0X2Z1bmN0aW9uKGZ1bj1kbm9ybSwgYXJncz1saXN0KG1lYW49MCwgc2Q9MSksIGNvbG91cj0iYmx1ZSIpICsKICBzdGF0X2Z1bmN0aW9uKGZ1bj1kc3R1ZGVudF90LCBhcmdzPWxpc3QoZGY9MiwgbXU9bWVhbihkZiRhKSwgc2lnbWE9c2QoZGYkYSkpKSsKICB4bGltKC0zLCAzKSArIHlsaW0oMCwgMC41NSkgKyBsYWJzKHg9TlVMTCwgeT1OVUxMKSArIHRoZW1lX3R1ZnRlKCkKYGBgCgoqSm9vbmlzOiBqdWh1dmFsaW0gbm9ybWFhbGphb3R1c2VzdCwgbWlsbGUga2Vza21pbmU9MCBqYSBzZD0xIChuPTM7IGFuZG1lcHVua3RpZCBvbiBuw6RpZGF0dWQgbXVzdGFkZSBtdW5hZGVuYSkuIFNpbmluZSBqb29uIC0gcG9wdWFsdHNpb29uLCBtaWxsZXN0IHTDtW1tYXRpIHZhbGltOyBwdW5hbmUgam9vbiAtIG5vcm1hYWxqYW90dXNlIG11ZGVsLCBtaXMgb24gZml0aXR1ZCB2YWxpbWkgYW5kbWV0ZWw7IG11c3Qgam9vbiAtIFN0dWRlbnRpIHQgamFvdHVzZSBtdWRlbCwgbWlzIG9uIGZpdGl0dWQgc2FtYWRlIGFuZG1ldGVnYS4qCgpNw7VsZW1hZCBtdWRlbGlkIG9uIHPDvHN0ZW1hYXRpbGlzZWx0IG5paHV0YXR1ZCB2w6Rpa3NlbWF0ZSB2w6TDpHJ0dXN0ZSBwb29sZSBqYSBhbGFoaW5kYXZhZCB2YXJpZWVydXZ1c3QuIHQgamFvdHVzZSBtdWRlbCBvbiBvb2RhdHVsdCBwYWtzZW1hdGUgc2FiYWRlZ2EgamEgZW5udXN0YWIgMC1zdCBrYXVnZWxlIHBhbGp1IHJvaGtlbSB2w6TDpHJ0dXNpIGt1aSBub3JtYWFsamFvdHVzZSBtdWRlbC4gS3VuYSBtZSB0ZWFtZSwgZXQgcG9wdWxhdHNpb29uIG9uIG5vcm1hYWxqYW90dXNlZ2EsIHBvbGUgdsOkZ2Egw7xsbGF0YXYsIGV0IHQgamFvdHVzIG1vZGVsZWVyaWIgc2VkYSBoYWx2ZW1pbmkga3VpIG5vcm1hYWxqYW90dXMuIAoKSWdhbCBqdWh1bCwgbcO1bmkgdGVpbmUganVodXZhbGltIGFubmFrcyBtZWlsZSBob29waXMgdGVpc3RzdWd1c2VkIG11ZGVsaWQsIG1pcyByb2hrZW0gdsO1aSB2w6RoZW0gZXJpbmV2YWQgYWxnc2VzdCBwb3B1bGF0c2lvb25pc3QuCgpNaXMganVodHViIGt1aSBtZSBrYXN1dGFtZSBvbWEgbm9ybWFhbGphb3R1c2UgbXVkZWxpdCB1dXRlIGFuZG1ldGUgc2ltdWxlZXJpbWlzZWtzPyBLdWkgbMOkaGVkYXNlZCBvbiBuZWVkIHNpbXVsZWVyaXR1ZCBhbmRtZWQgcG9wdWxhdHNpb29uaSBhbmRtZXRlZ2EgamEga3VpIGzDpGhlZGFzZWQgdmFsaW1pIGFuZG1ldGVnYSwgbWlsbGVnYSBtZSBub3JtYWFsamFvdHVzZSBtdWRlbGkgZml0dGlzaW1lPwoKYGBge3J9CnNldC5zZWVkKDE5KSAjbXV1ZGFiIHNpbXVsYXRzaW9vbmkga29ycmF0YXZha3MKI3TDtW1iYW1lIDMganVodXNsaWtrdSBhcnZ1IG5vcm1hYWxoYW90dXNlc3QsIG1pbGxlIGtlc2t2w6TDpHJ0dXMgPSAwIGphIHNkID0gMS4KZGYgPC0gdGliYmxlKHNhbXBsZV9kYXRhPXJub3JtKDMpKSAKI2ZpdGltZSBub3JtYWFsamFvdHVzZSBtdWRlbGkgdmFsaW1pIGtlc2ttaXNlIGphIHNkLWdhCm1lYW4oZGYkc2FtcGxlX2RhdGEpOyBzZChkZiRzYW1wbGVfZGF0YSkKI3NpbXVsZWVyaW1lIDEwMDAgdXV0IGFuZG1lcHVua3RpIGZpdGl0dWQgbXVkZWxpc3QKc2ltdWxhdGVkX2RhdGEgPC0gcm5vcm0oMTAwMCwgbWVhbihkZiRzYW1wbGVfZGF0YSksIHNkKGRmJHNhbXBsZV9kYXRhKSkKI2FydnV0YW1lIHNpbXVsZWVyaXR1ZCBhbmRtZXRlIGtlc2ttaXNlIGphIHNkIG5pbmcgam9vbmlzdGFtZSBuZWlzdCBoaXN0b2dyYW1taQptZWFuKHNpbXVsYXRlZF9kYXRhKTsgc2Qoc2ltdWxhdGVkX2RhdGEpOyBoaXN0KHNpbXVsYXRlZF9kYXRhKQpgYGAKCk5hZ3UgbsOkaGEsIG9uIHV1dGUgKHNpbXVsZWVyaXR1ZCkgYW5kbWV0ZSBrZXNrdsOkw6RydHVzIGphIFNEIHbDpGdhIHNhcm5hc2VkIGFsZ3NldGUgYW5kbWV0ZSBvbWFsZSwgbWlkYSBrYXN1dGFzaW1lIG11ZGVsaSBmaXR0aW1pc2VsLiBLYWhqdWtzIGVpIG9sZSBuZWVkIGFnYSBrYXVnZWx0a2kgbmlpIHNhcm5hc2VkIGFsZ3NlbGUgamFvdHVzZWxlLCBtaWxsZSBrdWp1IG1lIHDDvMO8YW1lIG9tYSBhbmRtZXRlIGphIG11ZGVsaSBwZWFsdCBlbm51c3RhZGEuIFNlZWdhIG9uIG1laWUgbXVkZWwgw7xsZS1maXR0aXR1ZCwgbWlzIHTDpGhlbmRhYiwgZXQgdGEga2FqYXN0YWIgbGlpZ3NlbHQgbmVpZCB2YWxpbWkgYXNwZWt0ZSwgbWlzIGVpIHBlZWdlbGRhIGFsZ3NlIHBvcHVsYXRzaW9vbmkgb21hZHVzaS4gTG9vbXVsaWt1bHQgZWkgdmFzdGEgw7xrc2tpIG11ZGVsIHDDpHJpc2VsdCB0ZWdlbGlra3VzZWxlLiBLw7xzaW11cyBvbiBwaWdlbSBzZWxsZXMsIGthcyBtw7VuaSBtZWllIG11ZGVsaXRlc3Qgb24gcGlpc2F2YWx0IGhlYSwgZXQgb2xsYSBrYXN1bGlrLiBWYXN0dXMgc2VsbGVsZSBzw7VsdHViLCBtaWxsZWtzIHBsYWFuaW1lIG9tYSBtdWRlbGl0IGthc3V0YWRhLgoKYGBge3J9Cm1lYW4oc2ltdWxhdGVkX2RhdGE+MCk7IG1lYW4oc2ltdWxhdGVkX2RhdGE+MSkKYGBgCkt1aSBwb3B1bGF0c2lvb25pdsOkw6RydHVzdGVzdCBvbiA1MCUgc3V1cmVtYWQga3VpIDAsIHNpaXMgbXVkZWxpIGrDpHJnaSB2YWV2YWx0IDMyJS4gS3VpIHBvcHVsYXRzaW9vbml2w6TDpHJ0dXN0ZXN0IG9uIDE2JSBzdXVyZW1hZCBrdWkgMSwgc2lpcyBtdWRlbGkgasOkcmdpIHZhZXZhbHQgNCUuClNlZSBpbGx1c3RyZWVyaWIgaMOkc3RpIG11ZGVsaSBrdmFsaXRlZXRpLgoKYGBge3J9CmxpYnJhcnkoYnJtcykKc2ltX3QgPC0gcnN0dWRlbnRfdCgxMDAwLCAyLCBtZWFuKGRmJHNhbXBsZV9kYXRhKSwgc2QoZGYkc2FtcGxlX2RhdGEpKQptZWFuKHNpbV90PjApOyBtZWFuKHNpbV90PjEpCmBgYApTYW1hZCBlbm51c3R1c2VkIHQgamFvdHVzZXN0IG9uIGlzZWdpIHBhcmVtYWQhIEFnYSBrdW1iIG9uIGlra2FnaSBwYXJlbSBtdWRlbCBwb3B1bGF0c2lvb25pbGU/CgoKIyMjIG5vcm1hYWxqYW90dXNlIGphIGxvZ25vcm1hYWxqYW90dXNlIGVyaWxpc3VzCgpOb3JtYWFsamFvdHVzIGphIGxvZ25vcm1hYWxqYW90dXMgb24gZXJpbGlzZWQgc2VzdCAKCigxKSBrZXNrbmUgcGlpcnRlb3JlZW0gw7x0bGViLCBldCBvbGd1IHRlaWUgdmFsaW0gw7xrc2vDtWlrIG1pbGxpc2UgamFvdHVzZWdhLCBwYWxqdWRlc3QgdmFsaW1pdGVzdCBhcnZ1dGF0dWQgKiphcml0bWVldGlsaXNlZCBrZXNrbWlzZWQqKiBvbiBhbGF0aSBlbmFtLXbDpGhlbSBub3JtYWFsamFvdHVzZWdhIChrdWkgbj4zMCkuIFNlbGxlIG1hdGVtYWF0aWxpc2UgZm9ybWFsaXNtaSB0dWxldHVzIGbDvMO8c2lrYWxpc3NlIG1hYWlsbWEgb24gbm4gImVsZW1lbnRhYXJzZXRlIHZpZ2FkZSBow7xwb3RlZXMiLCBtaWxsZSBrb2hhc2VsdCBwYWxqdWRlIHbDpGlrZXN0ZSDDvGtzdGVpc2VzdCBzw7VsdHVtYXR1dGUganVodXNsaWtlIGVmZWt0aWRlICh2aWdhZGUpIHN1bW1hIGFubmFiIHR1bGVtdXNla3Mgbm9ybWFhbGphb3R1c2UuIFBhcmFrdSBhbm5hdmFkIGVuYW11cyBiaW9sb29naWxpc2kgbcO1w7V0bWlzaSBlcmFuZGl0dWx0IG1pdHRlLW5lZ2F0aWl2c2VpZCB0dWxlbXVzaS4gU2FnZWxpIG9uIHNlbGxpc3RlIG3DtcO1dG1pc3RlIHR1bGVtdXN0ZSBqYW90dXNlZCBlYmFzw7xtbWVldHJpbGlzZWQgKHYuYS4gc2lpcywga3VpIGN2ID0gc2QvbWVhbiBvbiB2w6Rpa2UpIGphIHNpaXMgb24gbWVpbCBzYWdlbGkgdGVndSBsb2dub3JtYWFsamFvdHVzZWdhLCBtaXMgdGVra2liIGxvZy1ub3JtYWFsc2V0ZSBtdXV0dWphdGUga29ycnV0YW1pc2VzdCAobWl0dGUgbGlpdG1pc2VzdCwgbmFndSBub3JtYWFsamFvdHVzZSBwdWh1bCkuIEtlc2tuZSBwaWlydGVvcmVlbSAyOiBzdXZhbGlzZSBqYW90dXNlZ2EgbXV1dHVqYXRlICoqZ2VvbWVldHJpbGlzZWQga2Vza21pc2VkKiogb24gbG9nbm9ybWFhbGphb3R1c2VnYS4gRWxlbWVudGFhcnNldGUgdmlnYWRlIGjDvHBvdGVlcyAyOiBLdWkganVodXNsaWsgdmFyaWVlcnV2dXMgdGVraWIgcGFsanVkZSBqdWh1c2xpa2UgZWZla3RpZGUga29ycnV0YW1pc2VsLCBvbiB0dWxlbXVzZWtzIGxvZ25vcm1hYWxqYW90dXMuIExvZ25vcm1hYWxqYW90dXNlIGVsZW1lbnRpZGUgKGFydnVkZSkgbG9nYXJpdG1pbWlzZWwgc2FhbWUgbm9ybWFhbGphb3R1c2UuIAoKKDIpIE3DtWxlbWFkIGphb3R1c2VkIChub3JtYWFsIGphIGxvZ25vcm1hYWwpIG9uIG1ha3NpbWFhbHNlIGVudHJvb3BpYWdhIGphb3R1c2VkLiBFbnRyb29waWF0IHZhYWRlbGRha3NlIHNpaW4gaW5mb3JtYXRzaW9vbmkvbcO8cmEga2F1ZHUgLS0tIG1ha3NpbWFhbHNlIGVudHJvb3BpYWdhIHPDvHN0ZWVtIHNpc2FsZGFiIG1ha3NpbWFhbHNlbHQgbcO8cmEgamEgbWluaW1hYWxzZWx0IGluZm9ybWF0c2lvb25pIChTaGFubm9uaSBpbmZvcm1hdHNpb29uaXRlb29yaWEpLiBTZWUgdMOkaGVuZGFiLCBldCB2w6RsamFzcG9vbCBvbWEgcGFyYW1lZXRyaXRlIHR1dW5pdHVkIHbDpMOkcnR1c2kgb24gbmVlZCBub3JtYWFsLSBqYSBsb2dub3JtYWFsamFvdHVzZWQgbWluaW1hYWxzZWx0IGluZm9ybWF0aWl2c2VkLiBOw6RpdGVrcyBub3JtYWFsamFvdHVzZWwgb24ga2FrcyBwYXJhbWVldHJpdCwgbXUgamEgc2lnbWEgKGVoayBrZXNrbWluZSBqYSBzdGFuZGFyZGjDpGx2ZSkuIFNlZWdhLCBhbmRlcyBub3JtYWFsamFvdHVzZWxlIGV0dGUga2Vza3bDpMOkcnR1c2UgamEgc3RhbmRhcmRow6RsYmUgZmlrc2VlcmltZSDDvGhlc2VsdCBqYW90dXNlIGVoayBtdWRlbGkga3VqdSBqYSBzYW1hcyBsaXNhbWUgc2lubmEgbWluaW1hYWxzZWx0IG11dWQgKHNvb3ZpYW10dXQpIGluZm9ybWF0c2lvb25pLiBUZWlzZWQgbWFrc2ltYWFsc2UgZW50cm9vcGlhZ2EgamFvdHVzZWQgb24gZWtzcG9uZW50c2lhYWxuZSBqYW90dXMsIGJpbm9vbWphb3R1cyBqYSBwb2lzc29uaSBqYW90dXMuIE1ha3NpbWFhbHNlIGVudHJvb3BpYWdhIGphb3R1c2VkIHNvYml2YWQgaMOkc3RpIEJheWVzaSBwcmlvcml0ZWtzIHNlc3QgbWUgc3V1ZGFtZSBwYXJlbWluaSBrb250cm9sbGlkYSwgbWlsbGlzdCBpbmZvcm1hdHNpb29uaSBtZSBuZWlzc2Ugc3VydW1lLiAKCgojIyBLw7xzaW11c2VkLCBtaWRhIHN0YXRpc3Rpa2Ega8O8c2liCgpTdGF0aXN0aWthIGFiaWwgc2FhYiB2YXN0dXNlaWQgasOkcmdtaXNldGVsZSBrw7xzaW11c3RlbGU6CgoxKSAga3VpZGFzIG7DpGV2YWQgdsOkbGphIHRlaWUgYW5kbWVkIGVoayBtaWxsaW5lIG9uIGp1c3QgdGVpZSBhbmRtZXRlIGphb3R1cywga2Vza3bDpMOkcnR1cywgdmFyaWVlcnV2dXMgamEga29vcy12YXJpZWVydXZ1cz8gTsOkaXRla3MsIG3DtcO1ZGV0dWQgcGlra3VzdGUgamEga2FhbHVkZSBrb29zLXZhcmllZXJ1dnVzdCBzYWFiIG3DtcO1dGEga29ycmVsYXRzaW9vbmlrb3JkYWphIGFiaWwuCgoyKSAgbWlkYSBtZSBwZWFrc2ltZSB0ZWllIHZhbGltaSBhbmRtZXRlIHDDtWhqYWwgdXNrdW1hIHBvcHVsYXRzaW9vbmkgcGFyYW1lZXRyaSB0ZWdlbGlrdSB2w6TDpHJ0dXNlIGtvaHRhPyBOw6RpdGVrcywga3VpIG1laWUgYW5kbWV0ZSBww7VoamFsIGFydnV0YXR1ZCBrZXNrbWluZSBwaWtrdXMgb24gMTc4IGNtLCBzaWlzIGt1aSBwYWxqdSBvbiBtZWlsIHDDtWhqdXN0IGFydmF0YSwgZXQgdGVnZWxpayBwb3B1bGF0c2lvb25pIGtlc2ttaW5lIHBpa2t1cyA+IDE4NSBjbT8KCjMpICBtaWRhIMO8dGxlYiBzdGF0aXN0aWxpc2UgbXVkZWxpIHN0cnVrdHV1ciB0ZWFkdXNsaWt1IGjDvHBvdGVlc2kga29odGE/IE7DpGl0ZWtzLCBrdWkgbWVpZSBwb29sdCBtw7XDtWRldHVkIHBpa2t1c3RlIGphIGthYWx1ZGUga29vcy12YXJpZWVydXZ1c3Qgc2FhYiBow6RzdGkga2lyamVsZGFkYSBraW5kbGF0IHTDvMO8cGkgbGluZWFhcnNlIHJlZ3Jlc3Npb29uaW11ZGVsaWdhLCBzaWlzIG9uIG1laWwgZWhrIHTDtWVuZHVzbWF0ZXJqYWxpLCBldCBwaWtrdXMgamEga2FhbCBvbiBvbWF2YWhlbCBzZWxsaXNlbCB2aWlzaWwgc2VvdHVkIGphIGVlbGlzdGF0dWQgcGVha3Mgb2xlbWEgdGVhZHVzbGlrIHRlb29yaWEsIG1pcyBqdXN0IHNlbGxpc2Ugc2Vvc2UgdGVra2ltaXNlbGUgYmlvbG9vZ2lsaXNlIG1laGhhbmlzbWkgYW5uYWIuCgo0KSBtaWRhIGVubnVzdGFiIG11ZGVsIHR1bGV2aWt1IGtvaHRhPyBOw6RpdGVrcywgbWVpZSBsaW5lYWFybmUgcGlra3VzZS1rYWFsdSBtdWRlbCBzdXVkYWIgZW5udXN0YWRhIHR1bGV2aWt1cyBrb2d1dGF2YWlkIHBpa2t1c2UgYW5kbWVpZC4gQWdhIGt1aSBow6RzdGk/Cgo+IHN0YXRpc3Rpa2Egw7xsZXNhbm5lIG9uIGzDpGh0dXZhbHQgcGlpcmF0dWQgaHVsZ2FzdCBhbmRtZXRlc3QgamEgbXVkZWxpdGVzdCBrdmFudGlmaXRzZWVyaWRhIHBhcmltYWwgdsO1aW1hbGlrdWwgdmlpc2lsIGvDtWhlZHVzdCwgbWlkYSBwZWFrc2ltZSB0dW5kbWEgdmFzdGF0ZXMgZWVsdG9vZHVkIGvDvHNpbXVzdGVsZS4KClN0YXRpc3Rpa2EgZWkgdmFzdGEgb3RzZSB0ZWFkdXNsaWtlbGUga8O8c2ltdXN0ZWxlIGVnYSBrw7xzaW11c3RlbGUgcMOkcmlzIG1hYWlsbWEga29odGEuIFN0YXRpc3RpbGlzZWQgdmFzdHVzZWQgasOkw6R2YWQgYWxhdGkga2FzdXRhdHVkIGFuZG1ldGUgamEgbXVkZWxpdGUgcGlpcmlkZXNzZS4gU2VsbGVnYSBzZW9zZXMgcGVha3NpbWUgZWVsaXN0YW1hIGjDpHN0aSBrb2d1dHVkIHJpa2thbGlra2UgYW5kbWVpZCBqYSBwYWluZGxpa2tlIG11ZGVsZWlkLiBTaWlzIG9uIGxvb3R1c3QsIGV0IGjDvHBlIG11ZGVsaSBrb2VmaXRzaWVudGlkZXN0IHDDpHJpcyBtYWFpbG1hIGtpcmplbGRhbWlzc2UgdHVsZWIgw7xsZSBraXRzYW1hIGt1cmlzdGlrdS4gQmF5ZXNpbCBvbiBzaWluIGVlbGlzLCBzZXN0IG9zYXYgc3RhdGlzdGlrIHN1dWRhYiBrb29zdMO2w7ZzIHRlYWRsYXN0ZWdhIHByaW9yaSBtdWRlbGlzc2Uga8O8bGxhbHQgcGFsanUga2FzdWxpa2t1IGluZm90IGtvZ3VkYS4gU2FtYXMsIGFtYXTDtsO2ciBzdXVkYWIgYmF5ZXNpIGFiaWwgc2FtYXbDtXJyYSBrw6Rra2kga2VlcmF0YS4gTWlkYSBwYWluZGxpa3VtIG9uIG1lZXRvZCwgc2VkYSB2w6RoZW0gYXV0b21hYXRuZSBvbiBzZWxsZSBtw7Vpc3RsaWsga2FzdXRhbWluZS4KCiMyIG9zYS4gS3VpZGFzIG7DpGV2YWQgdsOkbGphIHRlaWUgYW5kbWVkPwoKIyNzdW1tYWFyc2VkIHN0YXRpc3Rpa3VkCgpTdW1tYWFybmUgc3RhdGlzdGlrID0gw7xrcyBudW1iZXIuICAKTWlsbGlzZWlkIHN0YXRpc3Rpa3VpZCBhcnZ1dGFkYSBqYSBtaWxsaXNlaWQgdsOkbHRpZGEsIHPDtWx0dWIgc3RhdGlzdGlsaXNlc3QgbXVkZWxpc3QgCgo+IHN1bW1hYXJzZSBzdGF0aXN0aWthIGFiaWwgaXNlbG9vbXVzdGFtZSBhKSB0w7zDvHBpbGlzdCB2YWxpbWkgbGlpZ2V0IChrZXNrbWlzdCksIGIpIG11dXR1amEgc2lzZXN0IHZhcmllZXJ1dnVzdCwgYykgZXJpbmV2YXRlIG11dXR1amF0ZSAocGlra3VzLCBrYWFsIHZtcykga29vcy12YXJpZWVydXZ1c3QKCiMjIyBrZXNrdsOkw6RydHVzZWQKCktlc2t2w6TDpHJ0dXN0IHNhYWIgbcO1w7V0YSBwYWFyaWwgdG9zaW5hbCBlcmluZXZhbCB2aWlzaWwsIG1pbGxlc3QgasOkcmduZXZhbHQga2FzdXRhbWUga29sbWUgdsO1aSBuZWxqYS4gRW5uZSBrdWkgdGUgYXJ2dXRhbWEga3VrdXRlLCBtw7VlbGdlIGrDpHJlbGUsIG1pa3MgdGUgc29vdml0ZSBrZXNrdsOkw6RydHVzdCB0ZWFkYS4gS2FzIHRlaWQgaHV2aXRhYiB2YWxpbWkgdMO8w7xwaWxpbmUgbGlpZ2U/IEt1aWRhcyB0ZSBzb292aWtzaXRlIHNlZGEgdMO8w7xwaWxpc3VzdCBkZWZpbmVlcmlkYT8gS2FzIHZhbGltaSBrZXNrbWlzZSBsaWlrbWVuYSB2w7VpIHZhbGltaSBrw7VpZ2UgYXJ2dWthbWEgbGlpa21lbmE/IHbDtWkgdmVlbCBrdWlkYWdpPyBTZWUsIG1pbGxpc3Qga2Vza3bDpMOkcnR1c3Qga2FzdXRhZGEgc8O1bHR1YiBzYWdlbGkgYW5kbWVqYW90dXNlIGt1anVzdC4gU8O8bW1lZXRyaWxpc2kgamFvdHVzaSBvbiBsaWh0c2FtIGlzZWxvb211c3RhZGEgamEgbWl0bWV0aXB1bGlzZWQgamFvdHVzZWQgb24gc2VsbGVzIG9zYXMga8O1aWdlIGtlaHZlbWFkLgoKTWluYSBlZWxpc3RhbiBzZWxsaXNlaWQgbsO1dWFuZGVpZCAobWlzIG9uIHJhbmdlbHQgc29vdml0dXNsaWt1ZCk6CgooMSkgS3VpIHZhbGltIG9uIG5vcm1hYWxqYW90dXNlZ2EgKGhpc3RvZ3JhbW0gb24gc8O8bW1lZXRyaWxpbmUpLCBoaW5kYSB0w7zDvHBpbGlzdCBsaWlnZXQgbMOkYmkgYXJpdG1lZXRpbGlzZSBrZXNrbWlzZSAobWVhbikuICAKCigyKSBNdWlkdSBrYXN1dGEgbWVkaWFhbmkgKG1lZGlhbikuIEt1aSB2YWxpbSBvbiBsaWlnYSB2w6Rpa2UsIGV0IGphb3R1c3QgaGlubmF0YSAoYWdhID4gNCksIGVlbGlzdGEgbWVkaWFhbmkuIE1lZGlhYW5pIHNhYW1pc2VrcyBqw6RyamVzdGF0YWtzZSBtw7XDtWRldHVkIHbDpMOkcnR1c2VkIHN1dXJ1c2UgasOkcmdpIGphIHbDtWV0YWtzZSBzZWxsZSByZWEga2Vza21pbmUgbGlpZ2UuIE1lZGlhYW4gb24gdsOkaGVtIHR1bmRsaWsgZWtzdHJlZW1zZXRlIHbDpMOkcnR1c3RlIChvdXRsaWVyaXRlKSBzdWh0ZXMga3VpIG1lYW4uIAoKKDMpIFZhbGltaSBrw7VpZ2UgbGV2aW51bWF0IGVzaW5kYWphdCBpc2Vsb29tdXN0YWIgbW9vZCBlaGsgamFvdHVzZSB0aXBwLiBTZWRhIG9uIGFnYSByYXNrZW0gdMOkcHNlbHQgbcOkw6RyYXRhIGphIG1pdG1ldGlwdWxpc2VsIGphb3R1c2VsIG9uIG1pdHUgbW9vZGkuIFTDtsO2dGFtaXNlbCBwb3N0ZXJpb29yc2V0ZSBqYW90dXN0ZWdhIG9uIG1vb2Qgc2FnZWxpIHBhcmltIGxhaGVuZHVzLiAKCmBgYHtyIGVjaG89RkFMU0V9CmFuZG1lZCA8LSBybG5vcm0oMTAwKQojbWVhbihhbmRtZWQpOyBtZWRpYW4oYW5kbWVkKQoKbW9kZSA8LSAgZnVuY3Rpb24oeCwgYWRqdXN0PTEpIHsKICB4IDwtIG5hLm9taXQoeCkKICBkeCA8LSBkZW5zaXR5KHgsIGFkanVzdD1hZGp1c3QpCnlfbWF4IDwtIGR4JHhbd2hpY2gubWF4KGR4JHkpXSAKeV9tYXgKfQptb2RlKGFuZG1lZCkKCnBsb3QoZGVuc2l0eShhbmRtZWQsIGFkanVzdD0xKSkKYWJsaW5lKHY9bW9kZShhbmRtZWQpLCBjb2w9InJlZCIpCmFibGluZSh2PW1lZGlhbihhbmRtZWQpLCBjb2w9ImJsdWUiKQphYmxpbmUodj1tZWFuKGFuZG1lZCkpCgpgYGAKSm9vbmlzOiBTaW11bGVlcml0dWQgbG9nbm9ybWFhbGphb3R1c2VnYSBhbmRtZWQuIFB1bmFuZSBqb29uIC0gbW9vZDsgc2luaW5lIGpvb24gLSBtZWRpYWFuOyBtdXN0IGpvb24gLSBhcml0bWVldGlsaW5lIGtlc2ttaW5lIChtZWFuKS4gTWlsbGluZSBuZWlzdCB2YXN0YWIgcGFyaW1pbmkgdGVpZSBpbnR1aXRzaW9vbmlnYSBuZW5kZSBhbmRtZXRlICJrZXNrdsOkw6RydHVzZXN0Ij8gTWlrcz8KCgoKIyMjIG11dXR1amEgc2lzZW5lIHZhcmllZXJ1dnVzCgpNZWFuLWlnYSBrw6RpYiBrb2trdSBzdGFuZGFyZGjDpGx2ZSAoU0QpLiAKClNEIG9uIHNhbWEgw7xoaWt1Z2EsIG1pcyBhbmRtZWQgKGphIGFuZG1ldGUga2Vza3bDpMOkcnR1cykuIFN0YXRpc3Rpa3V0ZSBodWxnYXMgZWVsaXN0YXR1ZCBmb3JtYWF0IG9uIG1lYW4gKFNEKSwgbWl0dGUgbWVhbiAoKy8tIFNEKS4gMSBTRCBrYXRhYiA2OCUgbm9ybWFhbGphb3R1c2VzdCwgMiBTRCDigJMgOTYlIGphIDMgU0Qg4oCTIDk5JS4gTm9ybWFhbGphb3R1cyBsYW5nZWIgc2VydmFkZXMga2lpcmVzdGksIG1pcyB0w6RoZW5kYWIsIGV0IHRhbCBvbiBwZWVuaWtlc2VkIHNhYmFkIGphIG7DpGl0ZWtzIDUgU0Qga2F1Z3VzZWwga2Vza21pc2VzdCBwYWlrbmViIHZhaWQgw7xrcyBwdW5rdCBtaWxqb25pc3QuIAoKTsOkaXRla3M6IGluaW1lc3RlIElRIG9uIG5vcm1hYWxqYW90dXNlZ2EsIG1lYW49MTAwLCBzZD0xNS4gU2VlIHTDpGhlbmRhYiwgZXQga3VpIHNpbnUgSVE9MTE1ICjDvGxpa29vbGkgYXN0dWphdGUga2Vza21pbmUgSVEpLCBzaWlzIG9uIHTDtWVuw6Rvc3VzLCBldCBqdWh1c2xpa3VsdCBrb2hhdHVkIGluaW1lbmUgb24gc2ludXN0IG51dGlrYW0sIDE4JSAoKDEwMCUgLSA2OCUpLzIgID0gMTglKS4gCgpLdWkgYWdhIOKAnHRlZ2VsaWt1bOKAnSBhbmRtZWphb3R1c2VsIG9uIOKAnHBha3Mgc2FiYeKAnSB2w7VpIGVzaW5ldmFkIG91dGxpZXJpZCwgc2lpcyBub3JtYWFsamFvdHVzdCBlZWxkYXYgbXVkZWwgdGFnYWIgw7xsZWhpbm5hdHVkIFNEIGphIHNlZWdhIMO8bGVoaW5uYXR1ZCB2YXJpZWVydXZ1c2UuIEt1aSBhbmRtZWQgc2FhdmFkIG9sbGEgYWludWx0IHBvc2l0aWl2c2VkLCBzaWlzIFNEID4gbWVhbi8yIHZpaXRhYiwgZXQgYW5kbWVkIGVpIHNvYmkgbm9ybWFhbGphb3R1c2UgbXVkZWxpZ2EgKHNlc3QgbXVkZWwgZW5udXN0YWIgbmVnYXRpaXZzZXRlIGFuZG1ldGUgZXNpbmVtaXN0IGvDvGxsYWx0IHN1dXJlIHNhZ2VkdXNlZ2EpLiAKCiAgICBOb3JtYWFsamFvdHVzIG9uIGRlZmluZWVyaXR1ZCBrYSBtw7VuZWRlIHRlaXN0ZSBqYW90dXN0ZSBqYW9rcyBwZWFsZSBub3JtYWFsamFvdHVzZSAKICAgIChQb2lzc2lvbmkgamFvdHVzLCBiaW5vb21qYW90dXMpLiAKICAgIEZ1bmt0c2lvb24gc2QoKSBqYSBzZWxsZSB0YWdhIG9sZXYgdmFsZW0sIG1pcyBvbiBsb29kdWQgbm9ybWFhbGphb3R1c2UgdGFyYmVrcywgCiAgICBqYSBuZWlkIGFsdGVybmF0aWl2c2VpZCBzdGFuZGFyZGjDpGxiZWlkIGVpIGFydnV0YS4gCiAgICBTZWVnYSB0YXN1YiBtZWVsZXMgcGlkYWRhLCBldCB0YXZhcMOkcmFuZSBzZCBrZWh0aWIgbm9ybWFhbGphb3R1c2UgbXVkZWxpIHBpaXJpZGVzIGphIGVpIGt1c2FnaWwgbXVqYWwhCgpLdWkgYW5kbWVkIGVpIHNvYmkgbm9ybWFhbGphb3R1c2Vzc2Ugc2lpcyB2w7VpYiBwYWtrdWRhIGthaHRlIGFsdGVybmF0aWl2c2V0IGxhaGVuZHVzdDogCgojIyMjCSgxKSBsb2dhcml0bWkgYW5kbWVkLiAKCkt1aSBsb2dhcml0bWltaW5lIG11dWRhYiBhbmRtZWQgbm9ybWFhbHNla3MsIHNpaXMgc2FhYiBsb2dhcml0bWl0dWQgYW5kbWV0ZXN0IGFydnV0YWRhIG1lYW4taSBqYSBTRCBqYSBzZWVqw6RyZWwgbcO1bGVtYWQgYW50aS1sb2dhcml0bWlkYS4gU2VsbGlzZWwganVodWwgYXZhbGRhZCBzYSBsw7VwdWtzIGdlb21lZXRyaWxpc2Uga2Vza21pc2UgamEgbXVsdGlwbGlrYXRpaXZzZSBTRCAobXVsdGlwbGlrYXRpaXZuZSBTRCA9IGdlb20gbWVhbiB4IFNEOyBnZW9tIG1lYW4vU0QpLiBHZW9tZWV0cmlsaW5lIGtlc2ttaW5lIG9uIGFsYXRpIHbDpGlrc2VtIGt1aSBhcml0bWVldGlsaW5lIGtlc2ttaW5lLiBMaXNha3Mgb24gU0QgaW50ZXJ2YWwgbsO8w7xkIGFzw7xtbWVldHJpbGluZSBqYSBTRCBvbiBhbGF0aSA+IDAuIE5hZ3UgZW5uZWdpLCA2OCUgbG9nbm9ybWFhbHNldGVzdCBhbmRtZXRlc3QgasOkw6RiIDFTRCB2YWhlbWlra3UgbmluZyA5NS41JSBhbmRtZXRlc3QgasOkw6RiIDJTRCB2YWhlbWlra3UuCgpsb2dub3JtYWFsc2V0ZSBhbmRtZXRlIHRhdmFww6RyYW5lIGlzZWxvb211c3R1cyBrZXNrbWlzZSBqYSBzdGFuZGFyZGjDpGxiZWdhOiBtZWFuKHNkKSBvbiAxLjgoMS45KS4gU2VlIHNkIGludGVydmFsIG9uIHPDvG1tZWV0cmlsaW5lLCBlaGtraSBhbmRtZXRlIGphb3R1cyBvbiB2w6RnYWdpIGViYXPDvG1tZWV0cmlsaW5lLiBMaXNha3MgZW5udXN0YWIgc3RhbmRhcmRow6RsdmUsIG1pcyBvbiBzdXVyZW0ga3VpIGtlc2t2w6TDpHJ0dXMsIHN1dXJlIHNhZ2VkdXNlZ2EgbmVnYXRpaXZzZWlkIHbDpMOkcnR1c2kuIFNhZ2VsaSBvbiBhZ2EgbmVnYXRpaXZzZWQgbXV1dHVqYSB2w6TDpHJ0dXNlZCB2w7VpbWF0dWQgKG7DpGl0ZWtzIG7DpGRhbGFzIHN1aXRzZXRhdHVkIHNpZ2FyZXR0aWRlIGFydikuIFNlZSBvbiBuw6RpZGUgaGFsdmFzdCBtdWRlbGlzdCEKCkp1aHVsIGt1aSB0ZWd1IGxvZ25vcm1hYWxzZXRlIGFuZG1ldGVnYSBvbiBtZWlsIHbDtWltYWx1cyBrYXN1dGFkYSBwYWxqdSBwYXJlbWF0IG11ZGVsaXQgdmFyaWVlcnV2dXNlbGUgLSBtdWx0aXBsaWthdGlpdnNldCBzdGFuZGFyZGjDpGx2ZXQ6CgpgYGB7ciBlY2hvPUZBTFNFfQoKbXVsdGlwbGljYXRpdmVfc2QgPC0gZnVuY3Rpb24oeCkgewogIHggPC0gbmEub21pdCh4KQogIGEgPC0gbG9nMTAoeCkKICBiIDwtIG1lYW4oYSkKICBjIDwtIHNkKGEpCiAgZ2VvbV9tZWFuIDwtIDEwKipiCiAgbXVsdF9zZCA8LSAxMCoqYwogIGxvd2VyMSA8LSBnZW9tX21lYW4vbXVsdF9zZAogIHVwcGVyMSA8LSBnZW9tX21lYW4gKiBtdWx0X3NkCiAgbG93ZXIyIDwtIGdlb21fbWVhbi8obXVsdF9zZCoqMikKICB1cHBlcjIgPC0gZ2VvbV9tZWFuICogKG11bHRfc2QqKjIpCiAgTWVhbiA8LSBtZWFuKHgpCiAgbG93ZXIzIDwtIG1lYW4oeCkgLSBzZCh4KQogIHVwcGVyMyA8LSBtZWFuKHgpICsgc2QoeCkKICBsb3dlcjQgPC0gbWVhbih4KSAtIHNkKHgpKjIKICB1cHBlcjQgPC0gbWVhbih4KSArIHNkKHgpKjIKICByZXN1bHRzIDwtIHRpYmJsZShTRD1jKCJtdWx0aXBsaWNhdGl2ZV9TRCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxpY2F0aXZlXzJTRCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgImFkZGl0aXZlX1NEIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkaXRpdmVfMlNEIiksIAogICAgICAgICAgICAgICAgICAgIE1FQU49YyhnZW9tX21lYW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX21lYW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhbiksIAogICAgICAgICAgICAgICAgICAgIGxvd2VyPWMobG93ZXIxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcjMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXI0KSwgCiAgICAgICAgICAgICAgICAgICAgdXBwZXI9Yyh1cHBlcjEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyMywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcjQpICkKICByZXN1bHRzCn0KCm11bHRpcGxpY2F0aXZlX3NkKGFuZG1lZCkKYGBgCgpUYXZhbGlzZSBhcml0bWVldGl0aWxpc2Uga2Vza21pc2UgYXNlbWVsIG9uIG1laWwgbsO8w7xkIGdlb21lZXRyaWxpbmUga2Vza21pbmUuICBWw7VyZGx1c2VrcyBvbiBhbnR1ZCBrYSB0YXZhbGluZSAoYXJpdG1lZXRpbGluZSkga2Vza21pbmUgamEgKGFkaXRpaXZuZSkgU0QuIEFkZGl0aWl2bmUgU0Qgb24gc2VsbGUgamFvdHVzZSBraXJqZWxkYW1pc2VrcyBzZWxnZWx0IGViYWFkZWt2YWF0bmUgKHZ0IGphb3R1c2UgcGlsdGkgw7xsYWxwb29sIGphIHbDtXJkbGUgbXVsaXRwbGlrYXRpaXZzZSBTRC1nYSkuCgoKS3VpZGFzIGFnYSB0w7bDtnRhYiBtdWx0aXBsaWthdGlpdm5lIHN0YW5kYXJkaMOkbHZlIG5vcm1hYWxqYW90dXNlc3QgcMOkcml0IGFuZG1ldGVnYT8gS3VpIG5vcm1hYWxzZXRlIGFuZG1ldGUgcGVhbCBtdWx0aXBsaWthdGlpdnNlIHNkIHJha2VuZGFtaW5lIHZpaWIga2F0YXN0cm9vZmluaSwgc2lpcyBwb2xlIHNlbCBzdGF0aXN0aWt1bCBzdXVydCBwcmFrdGlsaXN0IGthc3V0dXNydXVtaS4KYGBge3J9CnNldC5zZWVkKDUzNjMpCm5vcm1fYW5kbWVkIDwtIHJub3JtKDMsIDEwMCwgMjApCm11bHRpcGxpY2F0aXZlX3NkKG5vcm1fYW5kbWVkKQpgYGAKCk5hZ3UgbsOkaGEsIG9uIG11bHRpcGxpa2F0aWl2c2Ugc2Qga2FzdXRhbWluZSBub3JtYWFsc2V0ZSBhbmRtZXRlZ2Egw7xzbmEgb2h1dHUgKGt1aWdpLCBhaW51bHQgbmlpa2F1YSwga3VuaSBtZWlsIHB1dWR1dmFkIG5lZ2F0aWl2c2VkIGFuZG1lZCkuIFNlZWdhLCBrdWkgc2EgZWkgb2xlIGtpbmRlbCwga2FzIHRlZ3Ugb24gbm9ybWFhbGphb3R1c2VnYSB2w7VpIGxvZ25vcm1hYWxqYW90dXNlZ2EsIGFydmVzdGEsIGV0IGxvZ25vcm1hYWxqYW90dXMgb24gYmlvbG9vZ2lhcyDDvHNuYSB0YXZhbGluZSAoZXJpdGkgZW5zw7zDvG1yZWFrdHNpb29uaWRlIGphIGthc3Z1cHJvdHNlc3NpZGUganV1cmVzKS4gU2VlZ2Egb24gbcO1aXN0bGlrIGFsYXRpIGthc3V0YWRhIG11bHRpcGxpY2F0aXZlX3NkKCkgZnVua3RzaW9vbmkgamEga3VpIG3DtWxlbWEgU0QgdsOkw6RydHVzZWQgb24gc2FybmFzZWQsIHNpaXMgdsO1aWIgbG9vdGEsIGV0IGFuZG1lZCBvbiBub3JtYWFsc2VkIG5pbmcgc2FhYiBhdmFsZGFkYSB0YXZhcMOkcmFzZSBhZGRpdGlpdnNlIFNEIHJlZmVyZWVkZSByw7XDtW11a3MuCgo+IGt1aSBuIDwgMTAsIHNpaXMgbcO1bGVtYWQgU0QtZCBhbGFoaW5kYXZhZCB0ZWhuaWxpc3RlbCBww7VoanVzdGVsIHRlZ2VsaWtrdSBzZC1kLiAgRXR0ZXZhYXR1c3QgdsOkaWtlc3RlIHZhbGltaXRlZ2EhCgoKIyMjIyAoMikgaXNlbG9vbXVzdGEgYW5kbWVpZCBhbGdzZXMgc2thYWxhczogbWVkaWFuIChNQUQpLiAKCk1BRCDigJMtLSBtZWRpYW4gYWJzb2x1dGUgZGV2aWF0aW9uIC0tLSBvbiB2w6RoZW0gdHVuZGxpayBvdXRsaWVyaXRlIHN1aHRlcyBqYSBlaSBlZWxkYSBub3JtYWFsamFvdHVzdC4gUHV1ZHVzZWtzIG9uLCBldCBNQUQgZWkgb21hIHTDtWxnZW5kdXN0LCBtaWxsZSBrb2hhc2VsdCB0YSBow7VsbWFrcyBraW5kbGF0IHByb3RzZW50aSBwb3B1bGF0c2lvb25pIHbDtWkgdmFsaW1pIGFuZG1lamFvdHVzZXN0LiBTZWV2YXN0dSBzZCBwdWh1bCB2w7VpbWUgb2xsYSBraW5kbGFkLCBldCBpc2VnaSBrw7VpZ2UgaHVsbGVtYSBqYW90dXNlIGtvcnJhbCBqw6TDpHZhZCB2w6RoZW1hbHQgNzUlIGFuZG1ldGVzdCAyIFNEIHBpaXJpZGVzc2UuCgpgYGB7cn0KbWFkKGFuZG1lZCwgY29uc3RhbnQgPSAxKQpgYGAKCgoKICAgICDDhHJhIGt1bmFnaSBhdmFsZGEgYW5kbWVpZCB2b3JtaXM6IG1lYW4gKE1BRCkgdsO1aSBtZWRpYW4gKFNEKS4gCiAgICAgS29ycmVrdG5lIHZvcm0gb24gbWVhbihTRCkgdsO1aSBtZWRpYW4oTUFEKS4KCgoKIyMjIG11dXR1amF0ZSBrb29zLXZhcmllZXJ1dnVzCgpBbmRtZXRlIGtvb3MtdmFyaWVlcnV2dXN0IG3DtcO1ZGV0YWtzZSBrb3JyZWxhdHNpb29uaSBhYmlsLiBUdWxlbXVzZWtzIG9uIMO8a3MgbnVtYmVyIC0ga29ycmVsYXRzaW9vbmlrb3JkYWphIHIsIG1pcyB2YXJpZWVydWIgLTEgamEgMSB2YWhlbC4gCgogICAgciA9IDAg4oCTIGthaHRlIHTDvMO8cGkgbcO1w7V0bWlzZWQgKHg9cGlra3VzLCB5PWthYWwpIHNhbWFkZXN0IG3DtcO1dGVvYmpla3RpZGVzdCB2YXJpZWVydXZhZCDDvGtzdGVpc2VzdCBzw7VsdHVtYXR1bHQuIAogICAgciA9IDE6IGt1aSDDvGhlIG11dXR1amEgdsOkw6RydHVzIGthc3ZhYiwga2FzdmFiIGthIHRlaXNlIG11dXR1amEgdsOkw6RydHVzIGFsYXRpIHTDpHBzZWx0IHNhbWFzIHByb3BvcnRzaW9vbmlzLiAKICAgIHIgPSAtMToga3VpIMO8aGUgbXV1dHVqYSB2w6TDpHJ0dXMga2FzdmFiLCBrYWhhbmViIHRlaXNlIG11dXR1amEgdsOkw6RydHVzIGFsYXRpIHTDpHBzZWx0IHNhbWFzIHByb3BvcnRzaW9vbmlzLiAKICAgIApLdWkgciBvbiAtMSB2w7VpIDEsIHNhYW1lIG1lIHggdsOkw6RydHVzdCB0ZWFkZXMgdMOkcHNlbHQgZW5udXN0YWRhIHkgdsOkw6RydHVzZSAoamEgdmFzdHVwaWRpLCB0ZWFkZXMgeSB2w6TDpHJydXN0IHNhYW1lIHTDpHBzZWx0IGVubnVzdGFkYSB4IHbDpMOkcnR1c2UpLiAgICAKS3VpZGFzIHTDtWxnZW5kYW1lIGFnYSB0dWxlbXVzdCByID0gMC45PyBNaXR0ZSBrdWlkYWdpLiBTZWxsZSBhc2VtZWwgdMO1bGdlbmRhbWUgcjIgPSAwLjkqKjIgPSAwLjgxIOKAkyBtaXMgdMOkaGVuZGFiLCBldCB4LWkgdmFyaWVlcnV2dXMgc3V1ZGFiIHNlbGV0YWRhIDgxJSB5IHZhcmllZXJ1dnVzZXN0IGphIHZhc3R1cGlkaSwgZXQgWS1pIHZhcmllZXJ1dnVzIHN1dWRhYiBzZWxldGFkYSA4MSUgWC1pIHZhcmllZXJ1dnVzZXN0LiAKCmBgYHtyfQojY29ycmVsYXRpb248LWNvci50ZXN0KGlyaXMkU2VwYWwuTGVuZ3RoLCBpcmlzJFNlcGFsLldpZHRoLCBuYS5ybT1ULCBtZXRob2QgPSAicGVhcnNvbiIpICMgYSBsaXN0IG9mIDkKCiNuYW1lcyhjb3JyZWxhdGlvbikKI3N0cihjb3JyZWxhdGlvbikKI2NvcnJlbGF0aW9uJGNvbmYuaW50CmNvcihpcmlzJFNlcGFsLkxlbmd0aCwgaXJpcyRTZXBhbC5XaWR0aCwgdXNlPSJjb21wbGV0ZS5vYnMiKSAKYGBgCgoKS29ycmVsYXRzaW9vbmlrb3JkYWphIHbDpMOkcnR1cyBzw7VsdHViIG1pdHRlIGFpbnVsdCBhbmRtZXRlIGtvb3MtdmFyaWVlcnV2dXNlc3QgdmFpZCBrYSBhbmRtZXRlIHVsYXR1c2VzdC4gU3V1cmVtYSB1bGF0dXNlZ2EgYW5kbWVkIFggamEvdsO1aSBZIHRlbGplbCBhbm5hdmFkIGtlc2tlbHRsw6RiaSAwLXN0IGthdWdlbWFsIG9sZXZhIGtvcnJlbGF0c2lvb25pa29yZGFqYS4gU2VsbGUgcMOkcmFzdCBzb2JpYiBrb3JyZWxhdHNpb29uIGhhbHZhc3RpIG7DpGl0ZWtzIGtvcmR1c2thdHNldGUga29vc2vDtWxhIG3DtcO1dG1pc2Vrcy4gCgpMaXNha3MsIGtvcnJlbGF0c2lvb25pa29yZGFqYSBtw7XDtWRhYiB2YWlkIGFuZG1ldGUgKmxpbmVhYXJzZXQqIGtvb3MtdmFyaWVlcnV2dXN0OiBrdWkgYW5kbWVkIGtvb3MtdmFyaWVlcnV2YWQgbWl0dGUtbGluZWFhcnNlbHQsIHNpaXMgdsO1aXZhZCBrYSB2w6RnYSB0dWdldmFkIGtvb3MtdmFyaWVlcnV2dXNlZCBqw6TDpGRhIG3DpHJrYW1hdHVrcy4KCj4gS8O1aWsgc3VtbWFhcnNlZCBzdGF0aXN0aWt1ZCBrYW90YXZhZCBlbmFtdXNlIHRlaWUgYW5kbWV0ZXMgbGVpZHV2YXN0IGluZm9zdCDigJMgc2VlIGthb3R1cyBvbiDDtWlndXN0YXR1ZCBhaW51bHQgc2lpcywga3VpIHRlaWUgcG9vbHQgdmFsaXR1ZCBzdGF0aXN0aWsgaXNlbG9vbXVzdGFiIGjDpHN0aSBhbmRtZXRlIHPDvGdhdmFtYXQgb2xlbXVzdCAobsOkaXRla3MgdMO8w7xwaWxpc3QgbcO1w7V0bWlzdHVsZW11c3QgdsO1aSBhbmRtZXRlIHZhcmllZXJ1dnVzdCkuCgoKYGBge3IgZXZhbD1GQUxTRX0KI0t1aWRhcyBhcnZ1dGFkYSBjb3JyZWxhdHNpb29uaW1hYXRyaWtzaXQga29vcyBhZGp1c3RlZXJpdHVkIHAgdsOkw6RydHVzdGVnYQojbnVtZXJpYyBjb2x1bW5zIG9ubHkhCnByaW50KHBzeWNoOjpjb3JyLnRlc3QoaXJpc1stNV0sIHVzZT0iY29tcGxldGUiKSwgc2hvcnQgPSBGQUxTRSkKYGBgCgogIAojIzIuMiBFREEgLS0tIGVrc3Bsb3JhdG9vcm5lIGFuZG1lYW5hbMO8w7xzCgpLdWkgw7xoZW51bWJyaWxpbmUgYW5kbWV0ZSBzdW1tZWVyaW1pbmUgdMOkaWRhYiBlZWxrw7VpZ2Uga29ra3V2w7V0bGlrdSBrb21tdW5pa2F0c2lvb25pIGVlc23DpHJraSwgc2lpcyBFREEgb24gc3V1bmF0dWQgdGVhZGxhc2VsZSBlbmRhbGUuIEVEQSBlZXNtw6RyayBvbiBhbmRtZWlkIGVlbGvDtWlnZSBncmFhZmlsaXNlbHQgdmFhZGF0YSwgZXQgc2FhZGEgYWltdSAxKSBhbmRtZXRlIGt2YWxpdGVlZGlzdCBqYSAyKSBsYXN0YSBhbmRtZXRlbCAic2VsbGlzZW5hIG5hZ3UgbmFkIG9uIiBrw7VuZWxlZGEgamEgc3VnZXJlZXJpZGEgdXVkc2VpZCB0ZWFkdXNsaWtrZSBow7xwb3RlZXNlLiBOZWlkIGjDvHBvdGVlc2UgcGVha3Mgc2lpcyB0ZXN0aW1hIGZvcm1hYWxzZSBzdGF0aXN0aWxpc2UgYW5hbMO8w7xzaSBhYmlsLgoKPiBFREE6IG1pZGEgcm9oa2VtIGdyYWFmaWt1aWQsIHNlZGEgcm9oa2VtIHbDtWltYWx1c2kgdXV0ZSBtw7V0ZXRlIHRla2tla3MhCgpLw7VpZ2VwZWFsdCB2YWF0YW1lIGFuZG1laWQgbnVtYnJpbGlzZSBrb2trdXbDtXR0ZW5hOgpgYGB7cn0KcHN5Y2g6OmRlc2NyaWJlKGlyaXMpCgpgYGAKCk1pbGxpc2VkIGtvcnJlbGF0c2lvb25pZCB2w7Vpa3NpZCBhbmRtZXRlcyBlc2luZWRhPwpgYGB7cn0KbGlicmFyeShjb3JyZ3JhbSkgI1BDQSBmb3Igb3JkZXJpbmcKCmNvcnJncmFtKGlyaXMsIG9yZGVyPVRSVUUsIAogICAgICAgICBsb3dlci5wYW5lbCA9IHBhbmVsLnB0cywKICAgICAgICAgdXBwZXIucGFuZWwgPSBwYW5lbC5lbGxpcHNlLAogICAgICAgICBkaWFnLnBhbmVsID0gcGFuZWwuZGVuc2l0eSwKICAgICAgICAgbWFpbj0iQ29ycmVsb2dyYW0gb2YgZGlhbW9uZCBkYXRhc2V0IikKYGBgCgojIyMgS3VpZGFzIHV1cmlkYSBtdXV0dWphIHNpc2VzdCB2YXJpZWVydXZ1c3QKCk11dXR1amEgLSBtaWRhZ2ksIG1pZGEgbcO1w7VkZXRpIChuw6RpdGVrcyBtw7XDtXRlb2JqZWt0aWRlIGthYWwpLiAKS3VpIGlnYSBtdXV0dWphIGtvaHRhIG9uIHZhaWQgw7xrcyBudW1iZXIsIG1pZGEgcGxvdHRpZGEsIGthc3V0YSBDbGV2ZWxhbmQgcGxvdHRpOgoKYGBge3J9CmRkIDwtIGRpYW1vbmRzICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG51bWJlcl9vZl9kaWFtb25kcz1uKCkpCmRkICU+JSBnZ3Bsb3QoYWVzKHg9bnVtYmVyX29mX2RpYW1vbmRzLCAKICAgICAgICAgICAgICAgICAgeT1yZW9yZGVyKGNsYXJpdHksIG51bWJlcl9vZl9kaWFtb25kcykpKSArCiAgZ2VvbV9wb2ludChzaXplPTMpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvdXI9ImdyZXk2MCIsIGxpbmV0eXBlPSJkYXNoZWQiKSkgKwogIGxhYnMoeT0iY2xhcml0eSIpCmBgYAoKIyMjI1Bsb3RpIHZhbGlrIHPDtWx0dWIgdmFsaW1pIHN1dXJ1c2VzdC4KCjEpIE4gPCAyMCAtIHBsb3RpIGlnYSBhbmRtZXB1bmt0IGVyYWxkaSAoc3RyaXBjaGFydCgpLCBwbG90KCkpIGphIGtlc2ttaW5lIHbDtWkgbWVkaWFhbi4gCgoyKSAyMCA+IE4gPiAxMDA6IGdlb21fZG90cGxvdCgpIGhpc3RvZ3JhbW1pIHZhYXRlcwoKMykgTiA+IDEwMDogZ2VvbV9oaXN0b2dyYW0oKSwgZ2VvbV9kZW5zaXR5KCkgLS0tIG5lbmRlIGFiaWwgc2FhYiBrYSAyIGt1bmkgNiBqYW90dXN0IHbDtXJyZWxkYQoKNCkgTWl0bWUgamFvdHVzZSBrw7VydnV0aSB2YWF0YW1pc2VrcyBrdWkgTiA+IDE1OiBnZW9tX2JveHBsb3QoKSBvciwgd2hlbiBOID4gNTAsIGdlb21fdmlvbGluKCksIGdlb21fam95KCkgCgogCgpgYGB7cn0KVG9vdGhHcm93dGggPC0gVG9vdGhHcm93dGgKVG9vdGhHcm93dGgkZG9zZSA8LSBhcy5mYWN0b3IoVG9vdGhHcm93dGgkZG9zZSkKcDwtZ2dwbG90KFRvb3RoR3Jvd3RoLCBhZXMoeD1kb3NlLCB5PWxlbikpICsgCiAgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKcAojIENoYW5nZSBkb3RzaXplIGFuZCBzdGFjayByYXRpbywgYWRkIGxpbmUgb3IgZG90IGZvciBtZWRpYW4KZ2dwbG90KFRvb3RoR3Jvd3RoLCBhZXMoeD1kb3NlLCB5PWxlbikpICsgCiAgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJywKICAgICAgICAgICAgICAgc3RhY2tyYXRpbz0xLjUsIGRvdHNpemU9MC43KSsKICBzdGF0X3N1bW1hcnkoZnVuLnkgPSBtZWRpYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDk1LCAKICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDE1KSArCiAgdGhlbWVfdHVmdGUoKQoKcCArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWRpYW4sIGdlb209InBvaW50Iiwgc2hhcGU9MTgsCiAgICAgICAgICAgICAgICAgc2l6ZT01LCBjb2xvcj0icmVkIikKCiNhZGQgbWVhbiBhbmQgU0QsIHVzZSBwb2ludHJhbmdlCnAgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIiwgY29sb3I9InJlZCIpCiN1c2UgZXJyb3JiYXJzCnAgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICBnZW9tPSJlcnJvcmJhciIsIGNvbG9yPSJyZWQiLCB3aWR0aD0wLjIpICsKICBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgZ2VvbT0icG9pbnQiLCBzaXplPTMsIGNvbG9yPSJyZWQiKQpgYGAKCmBgYHtyfQoKYGBgCgoKClVzZSBhIGN1c3RvbSBzdW1tYXJ5IGZ1bmN0aW9uIDoKYGBge3J9CiMgRnVuY3Rpb24gdG8gcHJvZHVjZSBzdW1tYXJ5IHN0YXRpc3RpY3MgKGdlb21ldHJpYyBtZWFuIGFuZCBtdWx0aXDDvGxpY2F0aXZlIHNkKQptdWx0aV9zZCA8LSBmdW5jdGlvbih4KSB7CiAgeCA8LSBuYS5vbWl0KHgpCiAgYSA8LSBsb2cxMCh4KQogIGIgPC0gbWVhbihhKQogIGMgPC0gc2QoYSkKICBnX21lYW4gPC0gMTAqKmIKICBtc2QgPC0gMTAqKmMKICB5bWluIDwtIGdfbWVhbi9tc2QKICB5bWF4IDwtIGdfbWVhbiAqIG1zZAogcmV0dXJuKGMoeSA9IGdfbWVhbiwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4KSkgCn0KcCArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT1tdWx0aV9zZCwgY29sb3I9ImJsdWUiLCBzaXplPTEuMSkgKyB0aGVtZV90dWZ0ZSgpCmBgYAoKYGBge3J9CiMgQ2hhbmdlIGRvdCBwbG90IGNvbG9ycyBieSBncm91cHMKcDwtZ2dwbG90KFRvb3RoR3Jvd3RoLCBhZXMoeD1kb3NlLCB5PWxlbiwgZmlsbD1kb3NlKSkgKwogIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnAKYGBgCgpJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNoYW5nZSBtYW51YWxseSBkb3QgcGxvdCBjb2xvcnMgdXNpbmcgdGhlIGZ1bmN0aW9ucyA6CgpzY2FsZV9maWxsX21hbnVhbCgpIDogdG8gdXNlIGN1c3RvbSBjb2xvcnMKCnNjYWxlX2ZpbGxfYnJld2VyKCkgOiB0byB1c2UgY29sb3IgcGFsZXR0ZXMgZnJvbSBSQ29sb3JCcmV3ZXIgcGFja2FnZQoKc2NhbGVfZmlsbF9ncmV5KCkgOiB0byB1c2UgZ3JleSBjb2xvciBwYWxldHRlcwoKCmBgYHtyfQojQ2hvb3NlIHdoaWNoIGl0ZW1zIHRvIGRpc3BsYXkgOgpwICsgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygiMC41IiwgIjIiKSkKYGBgCgoKCkRvdHBsb3Qga3VpIGhpc3RvZ3JhbToKYGBge3J9CmdncGxvdChpcmlzLCBhZXMoU2VwYWwuTGVuZ3RoKSkgKyBnZW9tX2RvdHBsb3QoKQpgYGAKCkhpc3RvZ3JhbToKCmBgYHtyfQpnZ3Bsb3QoaXJpcywgYWVzKFNlcGFsLkxlbmd0aCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwLCBjb2xvcj0id2hpdGUiLCBmaWxsID0gIm5hdnlibHVlIikgCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2d0aGVtZXMpCmQgPC0gaXJpcyAgICAgICAgIyBGdWxsIGRhdGEgc2V0CmRfYmcgPC0gZFssIC01XSAgIyBCYWNrZ3JvdW5kIERhdGEgLSBmdWxsIHdpdGhvdXQgdGhlIDV0aCBjb2x1bW4gKFNwZWNpZXMpCgpnZ3Bsb3QoZGF0YSA9IGQsIGFlcyh4ID0gU2VwYWwuV2lkdGgsIGZpbGwgPSBTcGVjaWVzKSkgKwogIGdlb21faGlzdG9ncmFtKGRhdGEgPSBkX2JnLCBmaWxsID0gImdyZXkiLCBhbHBoYT0wLjgsIGJpbnM9MTApICsKICBnZW9tX2hpc3RvZ3JhbShjb2xvdXIgPSAiYmxhY2siLCBiaW5zPTEwKSArCiAgZmFjZXRfZ3JpZChTcGVjaWVzfi4pICsKICBndWlkZXMoZmlsbCA9IEZBTFNFKSArICAjIHRvIHJlbW92ZSB0aGUgbGVnZW5kCiAgdGhlbWVfdHVmdGUoKSAgICAgICAgICAjIGZvciBjbGVhbiBsb29rIG92ZXJhbGwKCmBgYAoKZGVuc2l0eSBwbG90OgpgYGB7cn0KaXJpcyU+JWdncGxvdCgpKwogIGdlb21fZGVuc2l0eShhZXMoU2VwYWwuV2lkdGgsIGZpbGw9U3BlY2llcywgY29sb3I9U3BlY2llcywgYWxwaGE9MC41KSkrCiAgdGhlbWVfdHVmdGUoKQoKYGBgCgpqb3lwbG90IHbDtWltYWxkYWIga8O1cnZ1dGkgcGFubmEgaXNlZ2kgc2FkdSBkZW5zaXR5IHBsb3R0ZQoKYGBge3J9CmxpYnJhcnkoZ2dqb3kpCmdncGxvdChpcmlzLCBhZXMoeD1TZXBhbC5MZW5ndGgsIHk9U3BlY2llcywgZmlsbD1TcGVjaWVzKSkgKyAKICBnZW9tX2pveShzY2FsZT00LCByZWxfbWluX2hlaWdodD0wLjAxLCBhbHBoYT0wLjkpICsKICB0aGVtZV9qb3koZm9udF9zaXplID0gMTMsIGdyaWQ9VFJVRSkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKQm94cGxvdDoKYGBge3J9CmdncGxvdChpcmlzLCBhZXMoU3BlY2llcywgU2VwYWwuV2lkdGgsIGZpbGw9U3BlY2llcykpICsgZ2VvbV9ib3hwbG90KCkKYGBgCgp2aW9saW4gcGxvdCBwbHVzIGppdHRlcnBsb3Q6CmBgYHtyfQpnZ3Bsb3QoaXJpcywgYWVzKFNwZWNpZXMsIFNlcGFsLldpZHRoKSkgKyAKICBnZW9tX3Zpb2xpbihhZXMoZmlsbD1TcGVjaWVzKSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4xLCBhbHBoYT0wLjQsIHNpemU9MC41KQpgYGAKCgojIyMgS2FoZSBtdXV0dWphIGtvb3MtdmFyaWVlcnVtaW5lIAoKYGBge3J9CiAgCmdncGxvdChkYXRhID0gZGlhbW9uZHMsIGFlcyh4ID0gZGVwdGgsIHkgPSBwcmljZSkpICsKICBnZW9tX3BvaW50KHNpemU9MC4xLCBhbHBoYT0wLjEpICsKICBnZW9tX2RlbnNpdHkyZCgpCmBgYAoKCkZpdCBhIGxpbmVhciBtb2RlbCBhbmQgcGxvdCB0aGUgZG90cyBhbmQgbW9kZWw6CmBgYHtyfQpnZ3Bsb3QoZGF0YT1pcmlzLCBhZXMoU2VwYWwuV2lkdGgsIFBldGFsLldpZHRoKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0icmVkIikgCmBgYAoKIyNKb29uZ3JhYWZpa3VkCgpKb29uZXTDvMO8YmlkIDog4oCcYmxhbmvigJ0sIOKAnHNvbGlk4oCdLCDigJxkYXNoZWTigJ0sIOKAnGRvdHRlZOKAnSwg4oCcZG90ZGFzaOKAnSwg4oCcbG9uZ2Rhc2jigJ0sIOKAnHR3b2Rhc2jigJ0uCgpgYGB7cn0KZGYyIDwtIGRhdGEuZnJhbWUoc2V4ID0gcmVwKGMoIkZlbWFsZSIsICJNYWxlIiksIGVhY2g9MyksCiAgICAgICAgICAgICAgICAgIHRpbWU9YygiYnJlYWtmZWFzdCIsICJMdW5jaCIsICJEaW5uZXIiKSwKICAgICAgICAgICAgICAgICAgYmlsbD1jKDEwLCAzMCwgMTUsIDEzLCA0MCwgMTcpICkKIyBDaGFuZ2UgbGluZSB0eXBlcwpnZ3Bsb3QoZGF0YT1kZjIsIGFlcyh4PXRpbWUsIHk9YmlsbCwgZ3JvdXA9c2V4KSkgKwogIGdlb21fbGluZShsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9wb2ludCgpCgojIENoYW5nZSBsaW5lIGNvbG9ycyBhbmQgc2l6ZXMKZ2dwbG90KGRhdGE9ZGYyLCBhZXMoeD10aW1lLCB5PWJpbGwsIGdyb3VwPXNleCkpICsKICBnZW9tX2xpbmUobGluZXR5cGU9ImRvdHRlZCIsIGNvbG9yPSJyZWQiLCBzaXplPTIpKwogIGdlb21fcG9pbnQoY29sb3I9ImJsdWUiLCBzaXplPTMpCmBgYAoKTXV1ZGFiIHTDvMO8cGkgYXV0b21hYXRzZWx0IG11dXR1amEgc2V4IHRhc2VtZSBqw6RyZ2kKYGBge3J9CiMgQ2hhbmdlIGxpbmUgdHlwZXMgYnkgZ3JvdXBzIChzZXgpCmdncGxvdChkZjIsIGFlcyh4PXRpbWUsIHk9YmlsbCwgZ3JvdXA9c2V4KSkgKwogIGdlb21fbGluZShhZXMobGluZXR5cGU9c2V4KSkrCiAgZ2VvbV9wb2ludCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIikKIyBDaGFuZ2UgbGluZSB0eXBlcyArIGNvbG9ycwpnZ3Bsb3QoZGYyLCBhZXMoeD10aW1lLCB5PWJpbGwsIGdyb3VwPXNleCkpICsKICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlPXNleCwgY29sb3I9c2V4KSkrCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9c2V4KSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJ0b3AiKQpgYGAKCk11dWRhIGpvb25pIGvDpHNpdHNpOgoKc2NhbGVfbGluZXR5cGVfbWFudWFsKCkgOiBqb29uZSB0w7zDvHAKCnNjYWxlX2NvbG9yX21hbnVhbCgpIDogam9vbmUgdsOkcnYKCnNjYWxlX3NpemVfbWFudWFsKCkgOiBqb29uZSBsYWl1cwpgYGB7cn0KIyBTZXQgbGluZSB0eXBlcyBtYW51YWxseQpnZ3Bsb3QoZGYyLCBhZXMoeD10aW1lLCB5PWJpbGwsIGdyb3VwPXNleCkpICsKICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlPXNleCkpKwogIGdlb21fcG9pbnQoKSsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzPWMoInR3b2Rhc2giLCAiZG90dGVkIikpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIikKIyBDaGFuZ2UgbGluZSBjb2xvcnMgYW5kIHNpemVzCmdncGxvdChkZjIsIGFlcyh4PXRpbWUsIHk9YmlsbCwgZ3JvdXA9c2V4KSkgKwogIGdlb21fbGluZShhZXMobGluZXR5cGU9c2V4LCBjb2xvcj1zZXgsIHNpemU9c2V4KSkrCiAgZ2VvbV9wb2ludCgpKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXM9YygidHdvZGFzaCIsICJkb3R0ZWQiKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCcjOTk5OTk5JywnI0U2OUYwMCcpKSsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXM9YygxLCAxLjUpKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIpCmBgYAoKCiMjIyNLb2trdXbDtXRlOgoKYS4JQW5kbWVwdW5rdGlkZSBwbG90dGltaW5lIHPDpGlsaXRhYiBtYWtzaW1hYWxzZWx0IGFuZG1ldGVzIG9sZXZhdCBpbmZvdCAobmlpIGthc3VsaWtrdSBpbmZvdCBrdWkgbcO8cmEpLiBBaXRhYiBsZWlkYSBvdXRsaWVyZWlkICh2YWxlc3RpIHNpc2VzdGF0dWQgYW5kbWVpZCwgdmFsZXN0aSBtw7XDtWRldHVkIHByb292ZSBqbXMpLiBLdWkgdmFsaW0gb24gdsOkaWtzZW0ga3VpIDIwLCBwaWlzYWIgdMOkaWVzdGkgw7xrc2lrdXRlIGFuZG1lcHVua3RpZGUgcGxvdGlzdCBrb29zIG1lZGlhYW5pZ2EuIERvdC1wbG90IHJ1dWxpYi4KCmIuCUhpc3RvZ3JhbW0g4oCTIGvDtWlnZXBlYWx0IG3DtcO1dHNrYWFsYSBqYSBzZWVqw6RyZWwgYW5kbWVkIGphZ2F0YWtzZSB2w7VyZHNlIGxhaXVzZWdhIGJpbm5pZGVzc2UgamEgcGxvdGl0YWtzZSBiaW5uaWRlIGvDtXJndXNlZC4gQmluLCBrdWh1IGzDpGtzIDIwIGFuZG1lcHVua3RpIG9uIDJYIGvDtXJnZW0ga3VpIGJpbiwga3VodSBsw6RrcyAxMCBhbmRtZXB1bmt0aS4gU2FtYXMsIGJpbmkgbGFpdXMvdWxhdHVzIG3DtcO1dGVza2FhbGFsIHBvbGUgdGVpbGUgZXR0ZSBhbnR1ZCDigJMgamEgc2VsbGVzdCB2w7VpYiBzw7VsdHVkYSBoaXN0b2dyYW1taSBrdWp1LiBTZWVnYSBvbiBzb292aXRhdiBwcm9vdmlkYSBlcmluZXZhaWQgYmluaSBsYWl1c2kgamEgdsO1cnJlbGRhIHNhYWR1ZCBoaXN0b2dyYW1tZS4gSGlzdG9ncmFtbSBzaXNhbGRhYiB2w6RoZW0gaW5mb3Qga3VpIGRvdCBwbG90LCBhZ2EgdsO1aW1hbGRhYiBwYXJlbWluaSB0YWJhZGEgc2VhZHVzcMOkcmFzaWQgJiBhbmRtZWphb3R1c3QgJiBvdXRsaWVyZWlkIHN1dXJ0ZSBhbmRtZWtvZ3VzdGUga29ycmFsLgoKYy4gRGVuc2l0eSBwbG90LiBTaWx1dHVkIHZlcnNpb29uIGhpc3RvZ3JhbW1pc3QsIG1pcyBrYW90YWIgaW5mb3QgYWdhIHRvb2IgdmFoZXN0IHbDpGxqYSBzaWduYWFsaSBtw7xyYSBhcnZlbC4gRGVuc2l0eSBwbG90dGUgb24gaGVhIGvDtXJ2dXRpIHZhYWRlbGRhIGpveSBwbG90aSBhYmlsLgoKZC4JQm94LXBsb3Qg4oCTIHNpc2FsZGFiIHbDpGhlbSBpbmZvdCBrdWkgaGlzdG9ncmFtbSwga3VpZCBuZWlkIG9uIGxpaHRzYW0ga8O1cnZ1dGkgdsO1cnJlbGRhLiBMZXZpbnVpbSB2YXJpYW50IChrdWlkIGthaGp1a3MgbWl0dGUgYWludXMpIG9uIFR1a2V5IGJveC1wbG90IOKAkyBtZWRpYWFuIChqb29uKSwgNTAlIElRUiAoYm94KSBqYSAxLDV4IElRUiAodnVudHNpZCksIHBsdXNzIG91dGxpZXJpZCBlcmFsZGkgcHVua3RpZGVuYS4KCmUuCVZpb2xpbiBwbG90IOKAkyBpbmZvcm1hdGlpdnN1c2VsdCBib3gtcGxvdGkgamEgaGlzdG9ncmFtbWkgdmFoZXBlYWwg4oCTIHNvYmliIHBhbGp1ZGUgamFvdHVzdGUga8O1cnZ1dGkgdsO1cmRsZW1pc2VrcwoKZi4JTGluZSBwbG90IOKAkyBrYXN1dGEgYWludWx0IHNpaXMga3VpIG5paSBYIGt1aSBZIHRlbGplbGUgb24ga2FudHVkIHBpZGV2IHbDpMOkcnR1cyAocGlra3VzLCBrYWFsLCBrb250c2VudHJhdHNpb29uLCBhZWcgam1zKS4gw4RyYSBrYXN1dGEsIGt1aSB0ZWxqZWxlIGthbnR1ZCBwdW5rdGlkZSB2YWhlbCBlaSBvbGUgbG9vZHVzZXMgbcO1dGV0IG9tYXZhaWQgcGlkZXZhaWQgdsOkw6RydHVzaSAobsOkaXRla3MgWCB0ZWxqZWwgb24ga2F0c2UgamEga29udHJvbGwgdsO1aSBlcmluZXZhZCB2YWxndW11dGF0c2lvb25pZCwgbWlsbGUgYWt0aWl2c3VzdCBvbiBtw7XDtWRldHVkKQoKZy4JU3VoZXRlIHbDtXJkbGVtaW5lIChwaWUgdnMgYmFyKQoKaC4JQ2xldmVsYW5kIHBsb3QgY291bnRpZGUgamFva3MuIEthc3V0YSBCYXJwbG90dGkgYWludWx0IHNpaXMsIGt1aSBDbGV2ZWxhbmQgcGxvdCB2bSBwbG90IG1pbmdpbCBww7VoanVzZWwgZWkgc29iaS4gQmFycGxvdCB2w7Vpa3Mgb2xsYSB2aWltYW5lIHZhbGlrLgoKPiBJbmZvcm1hdHNpb29uaSBodWxrIGthaGFuZXZhbHQ6IAppZ2EgYW5kbWVwdW5rdCBwbG90aXR1ZCAoZG90IHBsb3QpIC0+IApoaXN0b2dyYW0gLT4gCmRlbnNpdHkgcGxvdC92aW9saW4gcGxvdCAtPiAKYm94IHBsb3QgLT4gCmJhciBwbG90IHN0YW5kYXJkaMOkbHZldGVnYSAtPiAKQ2xldmVsYW5kIHBsb3QgKGJhcnBsb3QgaWxtYSB2ZWFwaWlyaWRldGEpIAoKI0rDpHRhIG1lZWxkZToKCjEuIHN0YXRpc3Rpa2EgdXVyaWIgZm9ybWFhbHNlaWQgbXVkZWxlaWQsIG1pdHRlIHRlb29yaWFpZCBlZ2EgcMOkcmlzIG1hYWlsbWEuCgoyLiBTdGF0aXN0aWthIGphZ2F0YWtzZSBrYWh0ZSBvc3NhOiBraXJqZWxkYXYgamEgasOkcmVsZGF2IChpbmZlcmVudGlhbCkuIAoKMy4gS2lyamVsZGF2IHN0YXRpc3Rpa2Ega2lyamVsZGFiIHRlaWUgYW5kbWVpZCBzdW1tYWFyc2V0ZSBzdGF0aXN0aWt1dGUgbmluZyBncmFhZmlsaXN0ZSBtZWV0b2RpdGUgYWJpbC4gCgo0LiBKw6RyZWxkYXYgc3RhdGlzdGlrYSBww7zDvGFiIHRlaWUgYW5kbWV0ZSBww7VoamFsIHRlaGEgasOkcmVsZHVzaSBzdGF0aXN0aWxpc2UgcG9wdWxhdHNpb29uaSBrb2h0YSwgbWlsbGVzdCBuZWVkIGFuZG1lZCBww6RyaW5ldmFkCgo1LiBTdGF0aXN0aWthIHDDtWhpbGluZSDDvGxlc2FubmUgb24ga3ZhbnRpZml0c2VlcmlkYSBlYmFraW5kbHVzdCwgbWlzIMO8bWJyaXRzZWIgbmVpZCBqw6RyZWxkdXNpLgoKIyNTw7VuYXN0aWsKCiogU3RhdGlzdGlsaW5lIHBvcHVsYXRzaW9vbiDigJMgb2JqZWt0aWRlIGtvZ3VtLCBtaWxsZWxlIHNvb3ZpbWUgdGVoYSBzdGF0aXN0aWxpc3Qgw7xsZGlzdHVzdC4gTsOkaXRla3MgaGlubmF0YSBrZXNrbWlzdCByYXZpbWkgbcO1anUgcGF0c2llbmRpcG9wdWxhdHNpb29uaXMuIFbDtWkgRXNjaGVyaWNoaWEgY29saSBlbnPDvMO8bWkgWCBrZXNrbWlzdCBLY2F0LWkuIAoKKiBWYWxpbSDigJMgbmVlZCBvYmpla3RpZCAocGF0c2llbmRpZCwgZW5zw7zDvG1pcHJlcGlkKSwgbWlkYSBtZSByZWFhbHNlbHQgbcO1w7VkYW1lLiAKCiogSnVodXZhbGltIOKAkyB2YWxpbSwgbWlsbGUgbGlpa21lZCBvbiBwb3B1bGF0c2lvb25pc3QgdmFsaXR1ZCBqdWh1c2xpa3VsdCBqYSBpc2VzZWlzdmFsdC4gU2VlIHTDpGhlbmRhYiwgZXQga8O1aWdpbCBwb3B1bGF0c2lvb25pIGxpaWttZXRlbCAoa8O1aWtpZGVsIHBhdHNpZW50aWRlbCB2w7VpIGvDtWlraWRlbCB2w7VpbWFsaWtlbCBlbnPDvMO8bWlwcmVwYXJhdHNpb29uaWRlbCkgb24gdsO1cmRuZSB2w7VpbWFsdXMgc2F0dHVkYSB2YWxpbWlzc2UgSkEsIGV0IHZhbGltaXNzZSBqdWJhIHNhdHR1bnVkIGxpaWttZSh0ZSkgcMO1aGphbCBlaSBvbGUgdsO1aW1hbGlrIGVubnVzdGFkYSBqw6RyZ21pc2VuYSB2YWxpbWlzc2Ugc2F0dHV2YXQgbGlpZ2V0LiAKCiogRXNpbmR1c2xpayB2YWxpbSDigJMgVmFsaW0gb24gZXNpbmR1c2xpaywga3VpIHRhIHBlZWdlbGRhYiBow6RzdGkgc3RhdGlzdGlsaXN0IHBvcHVsYXRzaW9vbmkuIEthIGp1aHV2YWxpbSBlaSBwcnV1Z2kgb2xsYSBlc2luZHVzbGlrIChqdWh1c2xpa3VsdCkuCgoqIFN0YXRpc3RpayDigJMgbWlkYWdpLCBtaXMgb24gdMOkcHNlbHQgYXJ2dXRhdHVkIHZhbGltaSBww7VoamFsIChuw6RpdGVrcyBwaWtrdXN0ZSBrZXNrbWluZSkKCiogUGFyYW1lZXRyaSB2w6TDpHJ0dXMg4oCTIHRlYWRtYXRhIHN1dXJ1cywgbWlsbGUgdMOkcHNldCB2w6TDpHJ0dXN0IG1lIHNhYW1lIGFpbnVsdCB1bWJrYXVkdSBlbm51c3RhZGEgYWdhIG1pdHRlIGt1bmFnaSB0w6Rwc2VsdCB0ZWFkYS4gKG7DpGl0ZWtzIG11ZGVsaSBpbnRlcmNlcHQsIHBvcHVsYXRzaW9vbmkga2Vza21pbmUgcGlra3VzOyBlZmVrdGkgc3V1cnVzID0ga2F0c2VncnVwaSBrZXNrbWluZSDigJMga29udHJvbGxncnVwaSBrZXNrbWluZSkKCiogU3RhdGlzdGlsaW5lIG11ZGVsIOKAkyBtYXRlbWFhdGlsaW5lIGZvcm1hbGlzZWVyaW5nLCBtaXMgc2FnZWxpIGtvb3NuZWIgMnN0IG9zYXN0OiBkZXRlcm1pbmlzbWxpayBwcm90c2Vzc2ktbXVkZWwgcGx1c3MganVodXNsaWsgdmVhL3ZhcmllZXJ1dnVzZS1tdWRlbC4gClByb3RzZXNzaS1tdWRlbGkgbsOkaXRla3Mga3VqdXRsZSwgZXQgbcO1w7VkYWQgbWl0bWUgaW5pbWVzZSBwaWtrdXN0IChYIG11dXR1amEpIGphIGthYWx1IChZIG11dXR1amEpLiBTaXJnZSB2w7VycmFuZGlnYSBZID0gYSArIGIgKiBYIChrYWFsID0gYSArIGIgKiBwaWtrdXMpIHNhYWIgYW5kYSBkZXRlcm1pbmlzbWxpa3UgbGluZWFhcnNlIGVubnVzdHVzZSBrYWFsdSBrb2h0YToga3VpIFggKHBpa2t1cykgbXV1dHViIMO8aGUgw7xoaWt1IChjbSkgdsO1cnJhLCBzaWlzIG11dXR1YiBZIChrYWFsKSB2w6TDpHJ0dXMga2Vza21pc2VsdCBiIMO8aGlrdSAoa2cpIHbDtXJyYS4gU2VldmFzdHUgdmFyaWVlcnV2dXNlLW11ZGVsIG9uIHTDtWVuw6Rvc3VzamFvdHVzIChuw6RpdCBub3JtYWFsamFvdHVzKS4gU2VsbGUgYWJpbCBtb2RlbGxlZXJpdGFrc2UgWS1zdXVuYWxpc3QgYW5kbWV0ZSB2YXJpZWVydXZ1c3QgaWdhbCBYIHbDpMOkcnR1c2VsIChuw6RpdGVrcywgbWlsbGluZSBvbiAxODIgY20gcGlra3VzdGUgaW5pbWVzdGUgb29kYXRhdiBrYWFsdWphb3R1cykuICBNdWRlbCBvbiBzZWVnYSB0w7VlbsOkb3N1c2xpazogbWUgc2FhbWUgbsOkaXRla3Mga8O8c2lkYTogbWlsbGlzZSB0w7VlbsOkb3N1c2VnYSBrYWFsdWIgMTgyIGNtIHBpa2t1bmUgaW5pbWVuZSDDvGxlIDEwMCBraWxvLiBNaWRhIGxhaWVtIG9uIHZhcmllZXJ1dnVzZSBtdWRlbGkgWS1pIHN1dW5hbGluZSBqYW90dXMgaWdhbCBYLWkgdsOkw6RydHVzZWwsIHNlZGEga2VodmVtaW5pIGVubnVzdGFiIG11ZGVsLCBtaWxsaXN0IFkgdsOkw6RydHVzdCB2w7VpbWUga29ua3JlZXRzZWx0IG9vZGF0YSBtaW5naSBYLWkgdsOkw6RydHVzZSBrb3JyYWwuIExpbmVhYXJzZXRlIG11ZGVsaXRlIGVlc23DpHJrIGVpIG9sZSBzaWlza2kgbWl0dGUgbmlpdsO1cmQgdXV0ZSBhbmRtZXRlIGVubnVzdGFtaW5lIChzZWRhIHRlZXZhZCBwYXJlbWluaSBrZWVydWxpc2VkIG11ZGVsaWQpLCB2YWlkIG11ZGVsaSBzdHJ1a3R1dXJpc3QgbMOkaHR1dmFsdCBww7VoanVzbGlrZSBow7xwb3RlZXNpZGUgcMO8c3RpdGFtaW5lL2tvbnRyb2xsaW1pbmUgKGthcyBpbmltZXNlIHBpa2t1cyB2w7Vpa3Mgb3RzZXNlbHQgcmVndWxlZXJpZGEva29udHJvbGxpZGEgdGVtYSBrYWFsdT8pLiBLdW5hIHNlbGxpbmUgdmlpcyB0ZWFkdXN0IHRlaGEgdMO2w7Z0YWIgw7xrc25lcyBsaWh0c2F0ZSBtdWRlbGl0ZSBrb3JyYWwsIG9uIGVuYW1rYXN1dGF0dWQgc3RhdGlzdGlsaXNlZCBtdWRlbGlkIHRhb3RsdXNsaWt1bHQgbGlodHN1c3RhdmFkIGphIGVpIHByZXRlbmRlZXJpIHTDtWVsw6RoZWR1c2VsZS4gCgoqIFRlaG5pbGluZSByZXBsaWthdHNpb29uIOKAkyBzYW1hIHByb292aSAocGF0c2llbnRpLCBlbnPDvMO8bWlwcmVwYXJhdHNpb29uaSwgaGlpcmUgcGVzYWtvbm5hIGxpaWdldCkgbcO1w7VkZXRha3NlIG1pdHUga29yZGEuIE3DtcO1ZGFiIHRlaG5pbGlzdCB2YXJpZWVydXZ1c3QgZWhrIG3DtcO1dG1pc3ZpZ2EuIFNlZGEgcMO8w7xhbWUga29udHJvbGxpZGEgcGFyYW5kYWRlcyBtw7XDtXRtaXNhcGFyYXR1dXJpL3Byb3Rva29sbGUgdsO1aSBzaWlzIGp1YmEgYW5kbWV0ZSB0YXNlbWVsLCBzdGF0aXN0aWxpc2UgYW5hbMO8w7xzaWdhLiBOw6RpdGVrcyBzYWFtZSBhbmRtZWlkIGFncmVnZWVyaWRhIGphIGFydnV0YWRhIGtlc2t2w6TDpHJ0dXNlLiBLdWkgYW5kbWVwdW5rdGUgb24gcGlpc2F2YWx0IGphIHZhcmllZXJ1dnVzIG9uIHPDvG1tZWV0cmlsaW5lIMO8bWJlciB0w7VlbGlzZSBwb3B1bGF0c2lvb25pdsOkw6RydHVzZSwgc2lpcyBhbm5hYiBrZWtzdsOkw6RydHVzIG1laWxlIGhlYSBoaW5uYW5ndSBwYXJhbWVldHJpIHTDtWVsaXNlbGUgdsOkw6RydHVzZWxlLgoKKiBCaW9sb29naWxpbmUgcmVwbGlrYXRzaW9vbiDigJMgZXJpbmV2YWlkIHBhdHNpZW50ZSwgZW5zw7zDvG1pcHJlcHBlLCBlcmluZXZhdGUgaGlpcmVwZXNha29uZGFkZSBsaWlrbWVpZCBtw7XDtWRldGFrc2UsIGlnYcO8aHQgw7xrcyBrb3JkLiBFZXNtw6RyayBvbiBtw7XDtXRhIEJpb2xvb2dpbGlzdCB2YXJpZWVydXZ1c3QsIG1pcyB0dWxlbmViIG3DtcO1dGVvYmpla3RpZGUgcmVhYWxzZXRlc3QgZXJpbmV2dXN0ZXN0OiBpZ2EgcGF0c2llbnQgamEgaWdhIGVuc8O8w7xtaW1vbGVrdWwgb24gZXJpbmV2IGvDtWlnaXN0IHRlaXN0ZXN0IG9tYXN1Z3VzdGVzdC4gQmlvbG9vZ2lsaW5lIHZhcmllZXJ1dnVzIG9uIHRlYWR1c2xpa3VsdCBodXZpdGF2IGphIHNlZGEgc2FhYiB2aXN1YWxpc2VlcmlkYSBhbGdhbmRtZXRlIHRhc2VtZWwgKG1pdHRlIGtlc2t2w6TDpHJ0dXNlIHRhc2VtZWwpIG7DpGl0ZWtzIGhpc3RvZ3JhbW1pbmEuClRlYWR1c2xpa2tlIGrDpHJlbGR1c2kgdGVoYWtzZSBiaW9sb29naWxpc3RlIHJlcGxpa2FhdGlkZSBww7VoamFsLiBUZWhuaWxpc2VkIHJlcGxpa2FhZGlkIHNlZXZhc3R1IGthbGlicmVlcml2YWQgbcO1w7V0ZXPDvHN0ZWVtaSB0w6Rwc3VzdC4gS3VpIHRlIHV1cml0ZSBzb29sZWtlcGlrZXN0IEUuIGNvbGksIGVpIHNhYSB0ZSB0ZWhhIGZvcm1hYWxzZXQgasOkcmVsZHVzdCBrw7VpZ2kgYmFrdGVyaXRlIGtvaHRhLiBTYW1hbW9vZGksIGt1aSB0ZSB1dXJpdGUgdmFpZCDDvGhlIGhpaXJlcGVzYWtvbm5hL3B1dXJpIGxpaWttZWlkLCBlaSBzYWEgdGUgdGVoYSBqw6RyZWxkdXNpIGvDtWlraWRlIGhpaXJ0ZSBrb2h0YS4gS3VpIHRlaWUga2F0c2Vza2VlbSBzaXNhbGRhYiBuaWkgdGVobmlsaXNpIGt1aSBiaW9sb29naWxpc2kgcmVwbGlrYWF0ZSBvbiBsaWh0c2FpbSB2aWlzIG5laWQgYW5kbWVpZCBhbmFsw7zDvHNpZGEga8O1aWdlcGVhbHQga2Vza21pc3RhZGEgw7xsZSB0ZWhuaWxpc3RlIHJlcGxpa2FhdGlkZSBuaW5nIHNlZWrDpHJlbCBrYXN1dGFkYSBzYWFkdWQga2Vza21pc2kgZWRhc2lzdGVzIGFydnV0dXN0ZXMgw7xsZSBiaW9sb29naWxpc3RlIHJlcGxpa2FhdGlkZSAobsOkaXRla3MgYXJ2dXRhZGEgbmVuZGUgcGVhbHQgdXVlIGtlc2ttaXNlLCBzdGFuZGFyZGjDpGx2ZSBqYS92w7VpIHVzYWxkdXNpbnRlcnZhbGxpKS4gU2VsbGluZSBrYWhlLWV0YXBpbGluZSBhcnZ1dHVza8OkaWsgZWkgb2xlIHNpaXNraSBvcHRpbWFhbG5lLiBPcHRpbWFhbG5lLCBrdWlkIGtlZXJ1a2FtLCBvbiBwYW5uYSBtw7VsZW1hdCB0w7zDvHBpIGFuZG1lZCDDvGh0ZSBoaWVyYXJoaWxpc3NlIG11ZGVsaXNzZS4KCiMjIyNUw7VlbsOkb3N1c2UgKFApIHJlZWdsaWQgb24gw7xoaXNlZCBrb2d1IHN0YXRpc3Rpa2FsZTogCiogUCBqw6TDpGIgMCBqYSAxIHZhaGVsZTsgUChBKSA9IDEgdMOkaGVuZGFiLCBldCBzw7xuZG11cyBBIHRvaW11YiBraW5kbGFzdGkuIAoqIGt1aSBzw7xuZG11c2VkIEEgamEgQiBvbiDDvGtzdGVpc3QgdsOkbGlzdGF2YWQsIHNpaXMgdMO1ZW7DpG9zdXMsIGV0IHRvaW11YiBzw7xuZG11cyBBIHbDtWkgc8O8bmRtdXMgQiBvbiBuZW5kZSBrYWhlIHPDvG5kbXVzZSB0w7VlbsOkb3N1c3RlIHN1bW1hIC0tLSBQKEEgdiBCKSA9IFAoQSkgKyBQKEIpLgoqIEt1aSBBIGphIEIgZWkgb2xlIMO8a3N0ZWlzdCB2w6RsaXN0YXZhZCwgc2lpcyBQKEEgdiBCKSA9IFAoQSkgKyBQKEIpIOKAkyBQKEEgJiBCKS4KKiBrdWkgQSBqYSBCIG9uIMO8a3N0ZWlzZXN0IHPDtWx0dW1hdHVkIChBIHRvaW11bWlzZSBqw6RyZ2kgZWkgc2FhIGVubnVzdGFkYSBCIHRvaW11bWlzdCBqYSB2YXN0dXBpZGkpIHNpaXMgdMO1ZW7DpG9zdXMsIGV0IHRvaW11dmFkIG3DtWxlbWFkIHPDvG5kbXVzZWQgb24gbmVuZGUgc8O8bmRtdXN0ZSB0w7VlbsOkb3N1c3RlIGtvcnJ1dGlzIOKAky0tIFAoQSAmIEIpID0gUChBKSB4IFAoQikuIAoqIEt1aSBCIG9uIGxvb2dpbGlzZWx0IEEgYWxhbW9zYSwgc2lpcyBQKEIpIDwgUChBKQoqIFAoQSB8IEIpIOKAky0tIHRpbmdsaWsgdMO1ZW7DpG9zdXMuIFPDvG5kbXVzZSBBIHTDtWVuw6Rvc3VzLCBqdWh1bCBrdWkgcGVha3MgdG9pbXVtYSBzw7xuZG11cyBCLiBQKHZpaG0gfCBwaWx2ZXMgaWxtKSBlaSBvbGUgc2FtYSwgbWlzIFAocGlsdmVzIGlsbSB8IHZpaG0pLgoqIEp1aHVsIGt1aSBQKEIpPjAsIHNpaXMgUChBIHwgQikgPSBQKEEgJiBCKS9QKEIpIGVoawoqIFAoQSB8IEIpID0gUChBKSB4IFAoQiB8IEEpL1AoQikg4oCTLS0gQmF5ZXNpIHRlb3JlZW0uCgpLdWlnaSBrw7VpayBzdGF0aXN0aWt1ZCBsw6RodHV2YWQgdMO1ZW7DpG9zdXN0ZWdhIHTDtsO2dGFtaXNlbCB0w6Rwc2VsdCBzYW1hZGVzdCBtYXRlbWFhdGlsaXN0ZXN0IHJlZWdsaXRlc3QsIHTDtWxnZW5kYXZhZCBlcmluZXZhZCBrb29sa29ubmFkIHNhYWR1ZCBudW1icmVpZCBlcmluZXZhbHQuIEtha3MgcMO1aGlsaXN0IGtvb2xrb25kYSBvbiBzYWdlZHVzbGlrdWQgc3RhdGlzdGlrdWQgamEgQmF5ZXNpYWFuaWQuIAoKKiBUw7VlbsOkb3N1cywgc2FnZWR1c2xpayB0w7VsZ2VuZHVzIOKAkyBwaWthYWphbGluZSBzw7xuZG11c3RlIHN1aHRlbGluZSBzYWdlZHVzLiBOw6RpdGVrcyA2LXRlIHNhZ2VkdXMgcGFsanVkZWwgdMOkcmluZ3V2aXNldGVsLiBTYWdlZHVzbGlrIHTDtWVuw6Rvc3VzIG9uIHRlYXR1ZCB0w7zDvHBpIGFuZG1ldGUgc2FnZWR1cywgdGluZ2ltdXNlbCBldCBudWxsaMO8cG90ZWVzIChIMCkga2VodGliOyBlaGsgUChhbmRtZWQgfCBIMCkuIE51bGxow7xwb3RlZXMgw7x0bGViIGVuYW1hc3RpLCBldCB1dXJpdGF2YSBwYXJhbWVldHJpIChuw6RpdGVrcyByYXZpbWllZmVrdGkgc3V1cnVzKSB2w6TDpHJ0dXMgb24gbnVsbC4gU2VlZ2EsIGt1aSBQIG9uIHbDpGlrZSwgZWkgb2xlIHNlZGEgdMO8w7xwaSBhbmRtZWQga29vc2vDtWxhcyBhcnZhbXVzZWdhLCBldCBwYXJhbWVldHJpIHbDpMOkcnR1cyBvbiBudWxsIChtaXMgYWdhIGVpIHTDpGhlbmRhIGF1dG9tYWF0c2VsdCwgZXQgc2EgcGVha3NpZCB1c2t1bWEsIGV0IHBhcmFtZWV0cmkgdsOkw6RydHVzIGVpIG9sZSBudWxsKS4gCgoqIFTDtWVuw6Rvc3VzLCBCYXllc2kgdMO1bGdlbmR1cyDigJMgdXN1IG3DpMOkciBtaW5naXNzZSBow7xwb3RlZXNpLiBOw6RpdGVrcyA2MiUgdMO1ZW7DpG9zdXMgKGV0IHBvcHVsYXRzaW9vbmkga2Vza21pbmUgcGlra3VzIDwgMTgwIGNtKSB0w6RoZW5kYWIsIGV0IHNhIG9sZWQgcmF0c2lvbmFhbHNlIG9sZW5kaW5hIG7DtXVzIGt1bHV0YW1hIG1pdHRlIHJvaGtlbSBrdWkgNjIgc2VudGkga2lobHZlbyBwZWFsZSwgbWlzIHbDtWlkdSBrb3JyYWwgdG9vYiBzdWxsZSBzaXNzZSAxIEVVUiAoamEgMzggc2VudGkga2FzdW1pdCkuIEJheWVzaSB0w7VlbsOkb3N1cyBvbWlzdGF0YWtzZSBzdGF0aXN0aWxpc2VsZSBow7xwb3RlZXNpbGUgKG7DpGl0ZWtzLCBldCByYXZpbWllZmVrdGkgc3V1cnVzIGrDpMOkYiB2YWhlbWlra3UgYSBrdW5pIGIpLCB0aW5naW11c2VsLCBldCBzdWwgb24gdMOkcHNlbHQgbmVlZCBhbmRtZWQsIG1pcyBzdWwgb247IGVoayBQKGjDvHBvdGVlcyB8IGFuZG1lZCkuIAoKCgoKCg==